[英]x86 Assembly: DIV operation with negative values
我目前尝试在以下汇编代码的上下文中了解DIV
操作:
push ebp
mov ebp, esp
mov eax [ebp+0x8]
mov edx, 0x0
div [ebp+0xC]
mov esp, ebp
pop ebp
ret
我们必须计算返回值。 该函数将使用以下值调用:
我认为1)和2)的结果分别为0和8。
现在我要计算3)和4)的结果。 据我所知, DIV
运算适用于无符号整数,我的第一个问题是,如何显示-3和-1?
我将进行如下操作:
关于第三种情况:
-3在两个恭维:11111101
所以
div:(24)0001100/11111101
结果如何?
第四个:
-1:11111111
所以
div:(-1)11111111/10
用2 = shr 1的除法-> 1111111-> 127
您能帮我验证一下结果吗?
eax
是一个32位寄存器。
这意味着div将对32位操作数起作用,而不是您似乎认为的字节值。
2的补码中的-3为FFFFFFFD
,十六进制= 4294967293
以十进制表示。 2的补码中的-1是FFFFFFFF
(十六进制)= 4294967295
(十进制)。
您可以使用任何计算器轻松地执行计算。 如果要除以字节值,则应使用
push ebp
mov ebp, esp
xor eax,eax ;mov eax,0
mov al, [ebp+0x8]
div al, byte ptr [ebp+0xC]
xor edx,edx
mov dl,ah ;put the remainder in edx
xor ah,ah
mov esp, ebp
pop ebp
ret
这部分
xor edx,edx
mov dl,ah ;remainder in edx
xor ah,ah
可以简化为
movzx edx,ah ;mov byte value with zero extend to full reg
xor ah,ah
结果将存储在al
,其余部分存储在ah
。
因为Intel使用的是低位字节序,所以只使用一个字节也没关系mov al,[some_address_as_before]
仍然可以使用。
在大型字节序架构上,您需要将地址调整3个字节。
如果要清除寄存器,通常使用xor a,a
比使用mov reg,0
更好mov reg,0
前者编码的字节数更少,运行速度更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.