这是一个组装功能。根据我的理解,这是一个通过创建循环来计算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
答案 0 :(得分:2)
Lodsb将数字放入AL
寄存器(仅低8位)
这一行...
Test Eax, Eax ;Avoid the null byte in Cmp Eax,0
...正在查看所有32位
答案 1 :(得分:0)
将代码片段Wikipedia: x86 instruction listings和Wikipedia: 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 )是学习一些遗留源代码时的方法