回 帖 发 新 帖 刷新版面

主题:请问shl eax,1 rcl edx,1

     xor edi,edi
     xor esi,esi
     mov ecx,0x40
     xor ebp,ebp
     mov eax,0x90ABCDEF
     mov edx,0x12345678
     mov ebx,0x74
 j1: shl eax,1                          // 算术左移64次
     rcl edx,1                              // 带进位循环左移64次
     rcl esi,1                              // 带进位循环左移64次
     rcl edi,1                              // 带进位循环左移64次
     cmp edi,ebp
     jb short j3
     ja short j2
     cmp esi,ebx
     jb short j3
 j2: sub esi,ebx
     sbb edi,ebp
     inc eax
j3:     dec ecx
     cmp ecx,0
jnz j1
高级语言怎么写

回复列表 (共1个回复)

沙发

你这段代码应该是64位除法子程序。基本原理是被除数减除数,每减一次加一次eax,直到不够减为止,在实现上通常不直接减,而是用移位实现。eax的结果为商。


改为高级语言的话,那很简单,在支持C99的C语言里,可以这么写:

long long ll_Dividend = 0x1234567890ABCDEF;
long long ll_Dividsor = 0x74;
long long ll_Result;
Result = ll_Dividend/ll_Dividsor;


其实,对于64位除法,没有必要专门用一个子程序去实现,协处理器本身就可以处理64位除法,例如:

dvdend    dq    1234567890ABCDEFh
dvdsor    dq    74h
result    dq    ?

fild dvdend
fild dvdsor
fdiv
fistp result

收工。

我来回复

您尚未登录,请登录后再回复。点此登录或注册