【发布时间】:2021-06-11 08:53:02
【问题描述】:
我编写了以下汇编代码。
它将 writeint 的输出显示为 +0
但是当我将调试点放在 writeint 之前的行并查看寄存器时
我看到EAX=0000BFBE。根据我的理解 writeint 应该打印 EAX 的值
登记。显示 +0 的原因可能是什么?
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
INCLUDE Irvine32.inc
.data
var1 byte 24
var2 word 4000h
var3 dword 0FFFF0000h
Z1 dword ?
Z2 dword ?
Z3 dword ?
Z4 dword ?
.code
main proc
xor eax, eax
mov al, var1
add al, 10
xor ebx, ebx
mov bx, var2
add bx, 100
sub ax,bx
mov eax, Z1
call writeint
invoke ExitProcess,0
main endp
end main
【问题讨论】:
-
区分大小写吗?你是对的,
WriteInt应该以十进制打印 EAX,解释为int32_t。 csc.csudh.edu/mmccullough/asm/help/… -
顺便说一句,您可以使用
movzx eax, byte ptr [var1]或其他方式进行零扩展负载,而不是将EAX 归零,然后将低字节与mov 合并到AL。你可以add ebx, 100/sub eax, ebx这样你就知道你的无符号字变量的差异被正确地符号扩展为 32 位 EAX,而没有潜在的溢出/截断(例如,如果结果为负)。在你的情况下,你会得到EAX = 0xFFFFBFBE,它会打印为-16450。 -
等一下,我把它误读为
mov eax, 21。但实际上你正在从Z1加载0。您是否确定在程序计数器指向call writeint时在 EAX 中看到了一个非零值,在您未包含mov eax, Z1的源代码的某些不同版本中,或者您之后将其设置为其他内容? -
未定义的内存变量在程序运行时被静默初始化为0,但如果在调试器中执行则可能不是这样。使用
mov eax, Z1,您正在加载EAX,其中包含未定义的内存变量Z1中碰巧存在的任何垃圾。