x86汇编--有符号整形的除法运算
在社区里看到这样一个帖子:
帮忙分析下为啥这个程序输出结果为0
在网友给的解答中,有这样一个问题没有想明白:
x86汇编如何处理有符号整形的除法运算?
为了便于描述,简化源代码如下:
// test_divide.c
#include <stdio.h>
void main()
{
int sa = -3;
int res;
res = sa / 2;
printf("sa / 2 = %d\n", res );
sa = -5;
res = sa / 4;
printf("sa / 4 = %d\n", res );
res = sa / 8;
printf("sa / 8 = %d\n", res );
res = sa / 5;
printf("sa / 5 = %d\n", res );
}
部分汇编输出如下:(VS2008,debug)
; 5 : int sa = -3;
mov DWORD PTR _sa$[ebp], -3 ; fffffffdH
; 8 : res = sa / 2;
mov eax, DWORD PTR _sa$[ebp]
cdq
sub eax, edx
sar eax, 1
mov DWORD PTR _res$[ebp], eax
; 10 : sa = -5;
mov DWORD PTR _sa$[ebp], -5 ; fffffffbH
; 11 : res = sa / 4;
mov eax, DWORD PTR _sa$[ebp]
cdq
and edx, 3
add eax, edx
sar eax, 2
mov DWORD PTR _res$[ebp], eax
; 13 : res = sa / 8;
mov eax, DWORD PTR _sa$[ebp]
cdq
and edx, 7
add eax, edx
sar eax, 3
mov DWORD PTR _res$[ebp], eax
; 15 : res = sa / 5;
mov eax, DWORD PTR _sa$[ebp]
cdq
mov ecx, 5
idiv ecx
mov DWORD PTR _res$[ebp], eax
可以看到,VS的汇编器在做有符号整数除法和无符号整数除法(分母为2的幂)时,生成的汇编代码还是有一些区别同时也很有技巧(通过简单的加减法和移位操作避免直接idiv指令)。
我的问题:有没有相关的资料介绍这些处理方法,或者说一些公式或是推导式?
C·诺亚方舟
12 years, 9 months ago