【发布时间】:2018-12-02 15:54:49
【问题描述】:
我想数数为 0 的数字。
MASM 错误:
循环变量
ecx(-1)。
使用 ollydb。
请帮忙。为什么它不起作用?
.586
.model flat, stdcall
extern ExitProcess@4:near
includelib c:\masm32\lib\user32.lib
includelib C:\masm32\lib\kernel32.lib
data segment
mas db 1,0,9,8,0,7,8,0,2,0
rez db 0
data ends
text segment
start:
mov cx, 10
xor ax, ax
xor si, si
jcxz exit
cycl:
cmp mas[si], 0
jne m1
inc al
m1:
inc si
loop cycl
mov rez,al
exit:
push 0
call ExitProcess@4
text ends
end start
【问题讨论】:
-
从那个 includelib 我猜你是在 Windows 上运行它。在 32 位或 64 位模式下使用 16 位寄存器总是不好的主意,请阅读 32 位模式下循环指令的文档 -> 它使用 ecx 而不是 cx,从 [si] 读取可能会生成 PME,除非您在环 0
-
这是一个 32 位程序。不要在没有充分理由的情况下使用 16 位寄存器。因此,至少将所有 cx 更改为 ecx,将所有 si 更改为 esi。
-
loop在 32 位模式下使用 ECX(不是 CX),但这不应该阻止它组装。 (不过,这段代码在 32 位模式下似乎是个糟糕的主意。16 位寻址模式可能无法寻址静态数据。而且您不会将 ECX 的高 16 位归零,因此循环可以运行很多次迭代)。但听起来你是在说你在尝试汇编时收到了来自 MASM 的错误消息,所以在 ollydbg 下没有可运行的可执行文件。没有行号吗?