繁体   English   中英

x86 Assembly:带负值的DIV操作

[英]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. func(3,24)
  2. 函数(24,3)
  3. func(24,-3)
  4. func(-1,2)

我认为1)和2)的结果分别为0和8。

现在我要计算3)和4)的结果。 据我所知, DIV运算适用于无符号整数,我的第一个问题是,如何显示-3和-1?

我将进行如下操作:

  1. 建立对param2的补充
  2. 执行二进制除法

关于第三种情况:

-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前者编码的字节数更少,运行速度更快。

进一步阅读
http://www.felixcloutier.com/x86/DIV.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM