word/byte/word ptr 的汇编正确用法
Assembly correct usage of word/byte/word ptr
我正在编写一个用于汇编的小型机器代码生成器。我有一个关于即时内存指令的问题:
让我们来看看这 3 种情况:
add [ebx+04], 0x1
add [ebx+04], 0x4040
add [ebx+04], 0x401000
我所做的是通过立即常数,我检查它可以容纳的最小字节数是多少然后我假设它是字节指针、字指针、双字指针
第一个可以容纳 1 个字节,所以我假设它是:
add byte ptr [ebx+04], 0x1
第二个可以容纳 2 个字节,所以我假设它是:
add word ptr [ebx+04], 0x4040
第三个适合 4 个字节,所以我假设它是:
add dword ptr [ebx+04], 0x401000
这是正确的吗?
如果您还实现了一种显式指定操作数大小的方法,并且由于它是您的汇编器,那么最终由您决定是否允许这样的 "smart" 推导。
强烈反对,程序员不根据立即数选择操作数大小,而是根据操作数大小选择立即数。
简单地说,我们认为 add DWORD [ebx+04h], 1
和 add WORD [ebx+04h], 1
是两个完全独立的指令。
您绝对需要在此类说明上接受尺码标签。
但我不会忽略代码以查看适合的数字,因为您将需要一种方法来决定是否可以使用基于符号扩展字节的较小编码:
add dword ptr [ebx+4], 1
这可以用 4 字节立即数编码,但更有趣的是用 1 字节立即数编码。
我正在编写一个用于汇编的小型机器代码生成器。我有一个关于即时内存指令的问题:
让我们来看看这 3 种情况:
add [ebx+04], 0x1
add [ebx+04], 0x4040
add [ebx+04], 0x401000
我所做的是通过立即常数,我检查它可以容纳的最小字节数是多少然后我假设它是字节指针、字指针、双字指针
第一个可以容纳 1 个字节,所以我假设它是:
add byte ptr [ebx+04], 0x1
第二个可以容纳 2 个字节,所以我假设它是:
add word ptr [ebx+04], 0x4040
第三个适合 4 个字节,所以我假设它是:
add dword ptr [ebx+04], 0x401000
这是正确的吗?
如果您还实现了一种显式指定操作数大小的方法,并且由于它是您的汇编器,那么最终由您决定是否允许这样的 "smart" 推导。
强烈反对,程序员不根据立即数选择操作数大小,而是根据操作数大小选择立即数。
简单地说,我们认为 add DWORD [ebx+04h], 1
和 add WORD [ebx+04h], 1
是两个完全独立的指令。
您绝对需要在此类说明上接受尺码标签。
但我不会忽略代码以查看适合的数字,因为您将需要一种方法来决定是否可以使用基于符号扩展字节的较小编码:
add dword ptr [ebx+4], 1
这可以用 4 字节立即数编码,但更有趣的是用 1 字节立即数编码。