【发布时间】:2016-07-09 11:53:43
【问题描述】:
我正在编写一个用于汇编的小型机器代码生成器。我有一个关于立即记忆指令的问题:
让我们来看看这 3 个场景:
add [ebx+04], 0x1
add [ebx+04], 0x4040
add [ebx+04], 0x401000
我所做的是通过立即常数,我检查它可以容纳的最小字节数然后我假设它的字节 ptr、字 ptr、dword ptr
第一个可以容纳 1 个字节,所以我假设它是:
add byte ptr [ebx+04], 0x1
Second 可以容纳 2 个字节,所以我假设它是:
add word ptr [ebx+04], 0x4040
第三个适合 4 个字节,所以我假设它是:
add dword ptr [ebx+04], 0x401000
这对吗?
【问题讨论】:
-
没有。您希望如何生成 1 的 32 位加法? PTR 注释的存在是有原因的。
-
字节 ptr、字 ptr 等命名是有原因的。因为用户需要能够选择哪个指令/操作数。如果你自己编,你可以用 addb, addw, addd 代替 x ptr。
-
如果 add [ebx+04], 0x00000001 产生一个 dword ptr,那么如果用户理解你的汇编语言规则,也许你可以侥幸逃脱。
-
声明很明显:给内存中的一个字节加 1 的效果与给内存中的一个双字加 1 的效果是不同的。在后一种情况下,进位(如果有)最多超过 4 个字节。
标签: assembly compiler-construction x86