装配功能令人困惑

时间:2014-08-23 14:36:58

标签: assembly nasm masm masm32

这是一个组装功能。根据我的理解,这是一个通过创建循环来计算eax中32位值的校验和的函数。

lodsb写入整个32位值时,我的困惑就出现了。根据我的理解,循环尝试在读取32位值后加载一个字节,在用于终止目的的eax指令之前将{0}加载到test。如果我错了,请通知我。

Checksum_Calc:
    lodsb
    test        eax, eax        ;avoids null byte in cmp eax, 0
    jz          CheckFunction
    add         edx, eax
    xor         edx, eax
    inc         edx
    jmp         Checksum_Calc

2 个答案:

答案 0 :(得分:2)

Lodsb将数字放入AL寄存器(仅低8位)

这一行...

   Test Eax, Eax        ;Avoid the null byte in Cmp Eax,0

...正在查看所有32位

答案 1 :(得分:0)

将代码片段Wikipedia: x86 instruction listingsWikipedia: Operators in C and C++转换为C伪代码将如下所示

eax = 0;
/* some invisible code */
while(true)
{
  al = mem[esi];   /* this modifies only lower 8bits overlayed over the 32bit eax "structure" */
  /* eax = (eax & 0xFFFFFF00) | al; */
  esi = esi + 1;
  if (eax == 0)
  {
    goto CheckFunction;
  }
  edx = edx + eax;
  edx = edx ^ eax;
  edx = edx + 1;
}

通常将代码转换为另一种更简单的语言甚至是图形语言(如#34;快速质量系统代码火箭设计师和#34;的作者发明的那种语言),请参阅example )是学习一些遗留源代码时的方法