【问题标题】:Writeint not displaying the value in EAX registerWriteint 不显示 EAX 寄存器中的值
【发布时间】: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_tcsc.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中碰巧存在的任何垃圾。

标签: assembly masm irvine32


【解决方案1】:

通过将断点放在前面的行上,我假设您的意思是您将断点放在这里:

mov eax, Z1

好吧,似乎这条指令在断点处暂停之前实际上并没有执行。以下是导致eax 成为0000BFBE 的事件链:

xor eax, eax
mov al, var1
add al, 10

mov al, var1eax 设置为18h18h + 1022h,所以整个eax 当前是00000022h

xor ebx, ebx
mov bx, var2
add bx, 100

mov bx, var2bx 设置为4000h4000h + 1004064h

sub ax,bx

这会计算22h - 4064h,其结果是二进制补码中的0bfbeh,因此整个eax0000bfbeh。这就是您看到的结果。

然而,mov eax, Z1 让这一切变得毫无用处。 Z1 已初始化为零,因此该行也将 eax 设置为 0。这就是为什么writeint 显示为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多