【发布时间】:2017-10-23 04:03:11
【问题描述】:
我的问题不是太大,但我不明白一些东西,我想寻求一些帮助。
我们正在学习汇编 .x86 语言,但我被 SUB 算术指令卡住了。
这是代码:
INCLUDE Irvine32.inc
.data
val_A DWORD 1234h
val_B DWORD 144h
.code
main proc
MOV EAX, val_B ;This works
SUB EAX, val_A
CALL WriteInt
CALL Crlf
INVOKE ExitProcess, 0
main endp
.stack
dw 100 dup(? )
end main
当我尝试这样说时:
MOV EAX, val_A
MOV EBX, val_B
SUB EBX, EAX
它不起作用。我们了解到 [SUB] 算术指令的工作原理与 [MOV] 和 [ADD] 一样,但是当我尝试将其用作 [SUB reg/reg] 时,绝对不会给出任何东西,只显示 EAX 寄存器中的内容。 我使用 Visual Studio 我不确定这是否是问题所在。
【问题讨论】:
-
结果存储在EBX中。因此,您需要添加 MOV EAX,EBX 以保持 WriteInt 满意并让它显示正确的值。
-
哦....这很简单...谢谢:)
-
第一个版本将结果放入 EAX,第二个放入 EBX。因此,由于您的 WriteInt 期望(我想)输入在 EAX 中,因此您有不同的行为。
-
WriteInt被硬编码为显示eax的值,它无法读懂您的想法而改为切换到ebx。总的来说几乎没有asm指令关心之前执行了什么,CPU的所有“状态”基本上都在寄存器的内容中,而内存的当前内容,它几乎不知道它是如何进入特定状态的(例如CPU不知道它是“里面”子程序,有多深)。您可以使用 Visual Studio 中的内置调试器在每条指令执行后检查寄存器和内存的内容(单步执行代码),我强烈建议这样做。 -
我认为它就像 CBW 等一样工作。所以一切都是线性的,但事实并非如此。现在说得通了。谢谢! :)