Assembly PROC参数中x86 ASM中的ROL

Assembly PROC参数中x86 ASM中的ROL,assembly,x86,md5,Assembly,X86,Md5,我不知道我是否做得很好,但我想在x86 MASM中为我的MD5实现做一个简单的过程。对于指令ROL,我似乎不能使用这种类型的编码 HCALC proc NEAR Avar: DWORD, Xvar: DWORD, Yvar: DWORD, Zvar: DWORD, Mvar: DWORD, S: DWORD, Hvar: DWORD pushad mov eax, Avar mov ebx, Xvar mov ecx, Yvar mov edx, Zvar xor ebx, ecx

我不知道我是否做得很好,但我想在x86 MASM中为我的MD5实现做一个简单的过程。对于指令ROL,我似乎不能使用这种类型的编码

HCALC proc NEAR Avar: DWORD, Xvar: DWORD, Yvar: DWORD, Zvar: DWORD, Mvar: DWORD, S: DWORD, Hvar: DWORD
pushad
mov eax, Avar 
mov ebx, Xvar 
mov ecx, Yvar 
mov edx, Zvar 

xor ebx, ecx 
xor ebx, edx 

add eax, ebx ; a + H(x,y,z)
add eax, Mvar ; a + H(x,y,z) + M[k]
add eax, Hvar ; a + H(x,y,z) + M[k] + h
rol eax, S ; (a + F(x,y,z) + M[k] + h) <<< s)

add eax, ebx ; x + ((a + F(x,y,z) + M[k] + h) <<< s), wynik całości w EAX
mov Avar, eax 
popad 
ret 
HCALC endp
HCALC程序靠近Avar:DWORD,Xvar:DWORD,Yvar:DWORD,Zvar:DWORD,Mvar:DWORD,S:DWORD,Hvar:DWORD
普沙德
莫夫埃克斯,阿瓦尔
mov-ebx,Xvar
mov-ecx,Yvar
mov-edx,Zvar
xor ebx,ecx
xor ebx,edx
添加eax、ebx;a+H(x,y,z)
添加eax、Mvar;a+H(x,y,z)+M[k]
添加eax、Hvar;a+H(x,y,z)+M[k]+H
rol eax,S;(a+F(x,y,z)+M[k]+h)该指令需要立即8位操作数或
CL
寄存器作为移位计数。使用

mov ecx, S
rol eax, cl
应该可以正常工作。

该指令需要立即8位操作数或
CL
寄存器作为移位计数。使用

mov ecx, S
rol eax, cl

应该可以正常工作。

此程序中有两个问题:

  • rol
    指令不能使用内存计数器。您应该将其移动到
    CL
    寄存器:

    mov ecx, S
    rol eax, cl ; (a + F(x,y,z) + M[k] + h) <<< s)
    

此程序中有两个问题:

  • rol
    指令不能使用内存计数器。您应该将其移动到
    CL
    寄存器:

    mov ecx, S
    rol eax, cl ; (a + F(x,y,z) + M[k] + h) <<< s)
    

    • 为什么不添加eax,X
?以与OP执行XORing时使用的方法保持一致。为什么不添加eax,X?以与OP执行XORing时使用的方法保持一致。您不需要
pushad
/
popad
ebx
是您使用的唯一保留调用的寄存器,因此只推/弹出ebx要快得多。另外,为什么不直接在
eax
中返回结果,而不是通过作为函数arg传递的指针(在堆栈上,讨厌)来存储结果呢。32位的
\uuu vectorcall
调用约定在寄存器中传递前两个参数,这样可以保存指令。我认为函数调用开销将是这方面的杀手。您在每个函数调用中只做了少量的工作。如果这主要是因为您无法让编译器在没有其他绒毛的情况下发出旋转指令,请参阅。此外,有关insn集合参考的链接,请参见x86标记wiki。每当汇编程序告诉您它不喜欢args作为指令时,请检查手册,看看它们允许是什么!您不需要
pushad
/
popad
ebx
是您使用的唯一保留调用的寄存器,因此只推/弹出ebx要快得多。另外,为什么不直接在
eax
中返回结果,而不是通过作为函数arg传递的指针(在堆栈上,讨厌)来存储结果呢。32位的
\uuu vectorcall
调用约定在寄存器中传递前两个参数,这样可以保存指令。我认为函数调用开销将是这方面的杀手。您在每个函数调用中只做了少量的工作。如果这主要是因为您无法让编译器在没有其他绒毛的情况下发出旋转指令,请参阅。此外,有关insn集合参考的链接,请参见x86标记wiki。每当汇编程序告诉您它不喜欢args作为指令时,请检查手册,看看它们允许是什么!