汇编高手进吧,帮我看看这段代码,再补充说明里,

来源:百度知道 编辑:UC知道 时间:2024/05/15 00:22:54
.386
.model flat,stdcall
option casemap:none
include windows.inc
.data
szString db 2 dup (0)
dwN dd 2 ;正确的是把dwN放在前面,不然程序报错,为什么呢,我调试了很久,不知道原因,请高手回答
.code
start:
mov esi,offset szString
@1:
mov eax,'a'
mov [esi],eax
inc esi
dec dwN
cmp dwN,1
jz @2
jmp @1
@2:
ret
end start

楼主,你调试这个程序的时候,有没有弹出这个?:"0x0040100a"指令引用的"0x00403000"内存.该内存不能为"written"...
本来,".data"数据段的地址是00402000,现在你的代码读到了本程序中根本不存在的"00403000"段!从而引发了"页异常错误".
再来仔细分析一下程序,原来:如果把dwN放在szString的后面,那么指令mov[esi],eax就会把dwN中原有的数据值2给覆盖掉了,于是程序只能不断是执行jmp@1,最后竟然读取到了00403000页!错误就发生了.
而把dwN放在了szString在前面,就免去了被mov [esi],eax覆盖的可能,从而使程序顺利地执行下去...

dec BYTE ptr dwN
cmp BYTE ptr dwN,1

你没加变量类型修饰符

还有你那个mov [esi],eax是不是应该把eax换成al?
不然的话会直接以双字的形式把61 00 00 00弄到内存里的,你后面定义的那个2就被覆盖了,也就是挂掉了

修改后的code段:

code
start:
mov esi,offset szString
@1:
mov al,'a';这里修改了
mov [esi],al;这里修改了
inc esi
dec BYTE ptr dwN;这里修改了
cmp BYTE ptr dwN,1;还有这里也修改了
jz @2
jmp @1
@2:
ret
end start

看样子你是想把一个以0结尾的字符串用'a'填充吧?