Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86程序集:具有负值的DIV操作_Assembly_X86 - Fatal编程技术网

Assembly x86程序集:具有负值的DIV操作

Assembly x86程序集:具有负值的DIV操作,assembly,x86,Assembly,X86,我目前试图在以下汇编代码的上下文中理解DIV操作: push ebp mov ebp, esp mov eax [ebp+0x8] mov edx, 0x0 div [ebp+0xC] mov esp, ebp pop ebp ret 我们必须计算返回值。将使用以下值调用该函数: func(3,24) func(24,3) func(24,-3) func(-1,2) 我认为1)和2)的结果分别为0和8 现在我想计算3)和4)的结果。正如我所知,DIV操作适用于无符号整数,我的第一个问题是,如

我目前试图在以下汇编代码的上下文中理解
DIV
操作:

push ebp
mov ebp, esp
mov eax [ebp+0x8]
mov edx, 0x0
div [ebp+0xC]
mov esp, ebp
pop ebp
ret
我们必须计算返回值。将使用以下值调用该函数:

  • func(3,24)
  • func(24,3)
  • func(24,-3)
  • func(-1,2)
  • 我认为1)和2)的结果分别为0和8

    现在我想计算3)和4)的结果。正如我所知,
    DIV
    操作适用于无符号整数,我的第一个问题是,如何表示-3和-1

    我将进行以下工作:

  • 建立两人对param2的赞美
  • 执行二进制除法
  • 关于第三种情况:

    -3是两个人的赞美:11111101

    所以

    分区:(24)0001100/111111 01

    结果会怎样

    第四条:

    -1:11111111

    所以

    分区:(-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使用little endian,所以只使用一个字节并不重要,
    mov al、[some\u address\u as\u prefore]
    仍能工作。
    在big-endian架构中,需要将地址调整3个字节

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

    进一步阅读

    谢谢,你说的对,我还没有意识到eax是一个32位寄存器:)现在,它让老师猜测,关注HTML标记的人会对这个问题感到非常惊讶…@rcgldr:
    DIV
    是指令的无符号形式,所以向零舍入和负无穷大有些难以区分。我认为这个问题需要
    IDIV