【问题标题】:Assembly x86 sub arithmetical instruction汇编 x86 子算术指令
【发布时间】: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 等一样工作。所以一切都是线性的,但事实并非如此。现在说得通了。谢谢! :)

标签: assembly x86


【解决方案1】:

子指令确实像 MOV 和 ADD 一样工作。 它确实作为 SUB reg/reg 工作。 当您尝试将 SUB 用作:

MOV EAX, val_A
MOV EBX, val_B
SUB EBX, EAX

你没有改变 EAX,就像你说的,寄存器 EAX 没有改变。 那是因为结果保存在 EBX 中。 要将 (1234h - 123h) 的结果放入寄存器 EAX,您应该编写以下代码:

MOV EAX, val_A
MOV EBX, val_B
SUB EAX, EBX

再次澄清一下,SUB 指令确实像 MOV 一样工作,为什么结果会移入第一个寄存器。例如:

MOV EAX, 1234h

将数字 1234h 放入寄存器 EAX 中,而不是相反。

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    相关资源
    最近更新 更多