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
我们必须计算返回值。将使用以下值调用该函数:
DIV
操作适用于无符号整数,我的第一个问题是,如何表示-3和-1
我将进行以下工作:
带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