注册 登录
编程论坛 汇编论坛

一个很简单的问题,帮忙看一下 谢谢

daiwulong 发布于 2009-10-08 19:53, 1189 次点击
代码如下:
INCLUDE Irvine32.inc
.code
main PROC
        
    mov EBP,402000H
    mov eax,19E0H
    mov [EBP],eax
    exit
main ENDP
END main
但是当执行到mov【ESP】,eax是出现错误,见附件。
谢谢各位了  有点急。
16 回复
#2
东海一鱼2009-10-08 20:55
代码段不可写。这样肯定会写异常。

两种解决方式:
1、在LINK时,指定代码段可写、可执行。

2、用虚拟内存管理API修改代码段可写。
#3
你们都要疼我哦2009-10-08 21:44
你看的是Intel汇编语言程序设计这本书吧.
#4
daiwulong2009-10-08 22:33
回复 2楼 东海一鱼
谢谢,我刚刚学习汇编,都不怎么懂。第一种是怎么回事啊   我用的是2005,我直接F10单步执行到那个地方就这样了。
能不能说一下第一种怎么实现的。谢谢
#5
daiwulong2009-10-08 22:36
回复 3楼 你们都要疼我哦
我们老师给了我们这个Assembly Language For Intel-Based Computers Fourth Edition
英文电子的,但是我们都没看,英文的看着太累人了   英语学得不好
#6
onepc2009-10-09 08:42
代码如下:
INCLUDE Irvine32.inc
.code
main PROC
        
    mov EBP,402000H
    mov eax,19E0H
    mov [EBP],eax
    exit
main ENDP
END main
但是当执行到mov【ESP】,eax是出现错误,见附件。
谢谢各位了  有点急。
以下是引用东海一鱼在2009-10-8 20:55:42的发言:

代码段不可写。这样肯定会写异常。

两种解决方式:
1、在LINK时,指定代码段可写、可执行。

2、用虚拟内存管理API修改代码段可写。

楼主你看下402000H这个地址的地方是什么来的?是否代码段之类的。

用od载入可以看下。。。   一般建议装入点没给占用的话一般都是400000的。偏二千的地方是什么来的。看下。
#7
daiwulong2009-10-09 10:30
回复 6楼 onepc
执行到mov [EBP],eax的时候寄存器显示


EAX = 000019E0 EBX = 7FFD6000 ECX = 0012FFB0 EDX = 7C92E514 ESI = 0A07F99C EDI = 00000000 EIP = 0040101A ESP = 0012FFC4 EBP = 00402000 EFL = 00000246

00402000 = CCCCCCCC
等到执行完这步时就会弹出这个错误,你们能不能再你们的机器上试一试,谢谢了
我刚看看汇编什么都不会,你们说的我也不懂啊 ,我编写的东西是不是不对啊?
#8
onepc2009-10-09 10:35
00402000 = CCCCCCCC
已写进去了。
你看下那个exit是什么来的。这个我还没用过。。
#9
daiwulong2009-10-09 10:47
回复 8楼 onepc
到那一步就不能继续执行了,就是弹出错误了。
我已经把eax赋值为19E0H,再把eax给了402000这个地址,但是执行不到exit就出现那个错误了
谢谢你了
#10
onepc2009-10-09 10:51
哦。那就是写不入402000这里了。看东海一条鱼的回复。。
#11
daiwulong2009-10-09 10:55
回复 10楼 onepc
他的第一种方法要怎么操作 ,我就是想问这个怎么弄的
#12
onepc2009-10-09 11:08
程序代码:
Link的用法
 
用Ml.exe编译的COFF格式的obj文件可以用Link.exe链接成可执行PE文件,Microsoft的Link.exe有两个系列的版本,用于链接DOS程序的链接器为Segmented Executable Linker;可以链接Win32 PE文件的链接器为Incremental Linker,这里指的是Incremental Linker的用法。
 
Link的命令行使用方法为:
 
Link [选项] [文件列表]
 
命令行参数中的文件列表用来列出所有需要链接到可执行文件中的模块,可以指定多个obj文件、res资源文件以及导入库文件。Link的选项很多,常用的选项如表2.3所示。
 
表2.3  Link的常用选项
 
选    项
 简    介
  
/BASE:地址
 指定程序装入内存的基地址,一般PE文件默认的装入地址是Ox400000处,dll文件装入Ox10000000,用此选项可以修改这个默认值
  
/COMMENT:注释
 在PE文件的文件头后面加上文本注释,想在可执行文件中加入版权字符串可以用这个办法,如果字符串中包括空格,那么要在头尾加双引号
  
/DEBUG
 在PE文件中加入调试信息
  
/DEBUGTYPE:类型
 加入的调试信息类型,可以是CV或COFF
  
/DRIVER:类型
 链接Windows NT的WDM驱动程序时用,类型可以是WDM或者UPONLY
  
/DLL
 链接动态链接库文件时用
  
/DEF:文件名
 编写链接库文件文件时使用的def文件名,用来指定要导出的函数列表
  
/ENTRY:标号
 指定入口标号
  
/IMPLIB:文件名
 当链接有导出函数的文件时(如DLL)要建立的导入库名
  
/INCREMENTAL:ON|OFF
 是否增量链接,增量链接只重写可执行文件自上次链接后改动的部分,所以可以增加链接速度,但会增加文件长度
  
/LIBPATH:路径
 指定库文件的目录
  
 
  
选    项
 简    介
   
  
/MACHINE:平台名称
 指定输出的可执行程序运行平台,可以是ALPHA,ARM,IX86,MIPS,MIPS16,MIPSR41XX,PPC,SH3和SH4等
  
/MAP:文件名
 生成MAP文件
  
/OUT:文件名
 指定输出文件名,默认的扩展名是 .exe,如果要生成其他文件名,如屏幕保护*.scr等,则在这里指定
  
/RELEASE
 填写文件头中的校验字段
  
/SECTION:节区,属性
 改变节区的属性,如exe文件中代码节区的属性通常是不可写的,用户也可以在这里将它设置为可写,属性可以是:E,R,W,S,D,K,L,P和X等
;;;这里。

  
/STACK:尺寸
 设定堆栈尺寸
  
/STUB:文件名
 这是一个有趣的参数,Win32文件有个简单的DOS文件头,以便在DOS下执行时打出“必须在Windows下执行”一类的消息,这部分称为DOS STUB,用户可以在这里指定用一个DOS可执行文件代替它,例如,可以用DOS的FDISK.EXE代替,那么程序在Windows下运行的会是用户编写的代码,但在DOS下运行的就是FDISK.EXE
  
/SUBSYSTEM:系统名
 指定程序运行的操作系统,可以是NATIVE,WINDOWS,CONSOLE,WINDOWSCE和POSIX等
  
#13
东海一鱼2009-10-09 11:14
/SECTION:.txt,RWE
#14
daiwulong2009-10-09 11:16
回复 12楼 onepc
看着都晕,我用visual studio 2005,都不懂。。。。。
不过还是很感谢你的。。。。。
#15
daiwulong2009-10-09 11:19
回复 13楼 东海一鱼
这个是什么,我用的是visual studio 2005,具体怎么弄能不能说一下,谢了
#16
onepc2009-10-09 11:22
可执行代码段,.text
数据段,.bss、.rdata、.data
资源段,.rsrc

参照一条鱼大大的回复



vs这个不知啊。。。我还以为是masm呢

[ 本帖最后由 onepc 于 2009-10-9 11:23 编辑 ]
#17
东海一鱼2009-10-09 11:30
在你的工程链接选项里面加上上面的,就行了。我用的vc6.0,vc2005没用过,你参照一下吧
只有本站会员才能查看附件,请 登录


[ 本帖最后由 东海一鱼 于 2009-10-9 11:35 编辑 ]
1