x86汇编:具有负值的DIV操作

时间:2017-01-24 11:01:45

标签: assembly x86

我目前尝试在以下汇编代码的上下文中理解bool validInput = false; PromptResult pResult; PromptConfig pConfig = new PromptConfig { Message = "Some message", MaxLength = 10, Placeholder = "Number...", OnTextChanged = args => { if (args.Value.Length < 1) args.IsValid = false; foreach (char c in args.Value) { if (!char.IsNumber(c)) { args.IsValid = false; break; } } } }; pResult = await UserDialogs.Instance.PromptAsync(pConfig); if(pResult.Ok) { validInput = true; } if (validInput) { Navigation.PushAsync(new MenuPage())); } 操作:

DIV

我们必须计算返回值。将使用以下值调用该函数:

  1. FUNC(3,24)
  2. FUNC(24,3)
  3. FUNC(24,-3)
  4. FUNC(-1,2)
  5. 在我看来,1)和2)的结果是0和8。

    现在我想计算3)和4)的结果。我知道push ebp mov ebp, esp mov eax [ebp+0x8] mov edx, 0x0 div [ebp+0xC] mov esp, ebp pop ebp ret 操作使用无符号整数,我的第一个问题是,如何呈现-3和-1?

    我将按以下步骤进行:

    1. 建立对param2的赞美之词
    2. 执行二元分割
    3. 关于第三种情况:

        

      -3有两个赞美:11111101

      所以

        

      div:(24)0001100/11111101

      结果会是什么?

      第四个:

        

      -1:11111111

      所以

        

      div:( - 1)11111111/10
        div = 2 = shr 1 - &gt; 1111111 - &gt; 127

      你能帮我验证一下结果吗?

1 个答案:

答案 0 :(得分:2)

eax是32位寄存器 这意味着div将处理32位操作数,而不是像你想象的那样的字节值 -3 in 2的补码是FFFFFFFD十六进制= ‭4294967293‬十进制。 -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中 由于英特尔使用的是小端,因此只使用一个字节并不重要,mov al,[some_address_as_before]仍可正常工作。
在大端架构上,您需要将地址调整3个字节。

如果要清除寄存器,通常最好使用xor a,a而不是使用mov reg,0,前者编码的字节数更少,运行速度更快。

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