汇编正确使用字/字节/字ptr

时间:2016-07-09 11:53:43

标签: assembly compiler-construction x86

我正在为装配编写一个小机器代码生成器。我有一个关于即时记忆指令的问题:

我们来看看这3个场景:

add [ebx+04], 0x1
add [ebx+04], 0x4040
add [ebx+04], 0x401000

我所做的是通过立即数,我检查它可以适应的最小字节数然后我假设它的字节是ptr,word ptr,dword ptr

第一个可以适合1个字节,所以我认为它是:

add byte ptr [ebx+04], 0x1

第二个可以容纳2个字节,所以我认为它是:

add word ptr [ebx+04], 0x4040

第三个适合4个字节,所以我认为它是:

add dword ptr [ebx+04], 0x401000

这是对的吗?

2 个答案:

答案 0 :(得分:5)

你绝对需要在这些指令上接受尺码标签。

但我不会忽略代码以查看哪些数字合适,因为您需要一种方法来决定使用基于扩展字节的符号的较小编码的可能性:

add dword ptr [ebx+4], 1

这可以用4字节立即编码,但也可以用1字节立即编码。

答案 1 :(得分:3)

如果您还实现了一种明确指定操作数大小的方法,并且因为它是您的汇编程序,那么最终您的调用是允许或不允许这样的“智能”演绎。

我强烈反对它,程序员不会根据即时值选择操作数大小,而是根据操作数大小选择immediates。
简而言之,我们会考虑add DWORD [ebx+04h], 1add WORD [ebx+04h], 1两个完全独立的指令。