PROC 参数中的 x86 ASM 中的 ROL

ROL in x86 ASM in PROC parameter

我不知道我这样做是否正确,但我想在 x86 MASM 中为我的 MD5 实现制作一个简单的 PROC。对于指令 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

报错error A2070: invalid instruction operands

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

mov ecx, S
rol eax, cl

应该可以正常工作。

你在这个程序中遇到了 2 个问题:

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

    mov ecx, S
    rol eax, cl ; (a + F(x,y,z) + M[k] + h) <<< s)
    
  • 当你做最后的加法时,EBX 不再保存 X 变量而是 H(X ,Y,Z)

    mov ebx, X
    add eax, ebx ; x + ((a + F(x,y,z) + M[k] + h) <<< s)