Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编函数令人困惑_Assembly_Nasm_Masm_Masm32 - Fatal编程技术网

Assembly 汇编函数令人困惑

Assembly 汇编函数令人困惑,assembly,nasm,masm,masm32,Assembly,Nasm,Masm,Masm32,这是一个汇编函数。据我所知,这是一个函数,通过创建循环来计算eax中32位值的校验和 当lodsb写入整个32位值时,我感到困惑。据我所知,循环尝试在读取32位值后加载一个字节,在用于终止目的的test指令之前将零加载到eax。如果我错了,请告诉我 Checksum_Calc: lodsb test eax, eax ;avoids null byte in cmp eax, 0 jz CheckFunction ad

这是一个汇编函数。据我所知,这是一个函数,通过创建循环来计算
eax
中32位值的校验和

lodsb
写入整个32位值时,我感到困惑。据我所知,循环尝试在读取32位值后加载一个字节,在用于终止目的的
test
指令之前将零加载到
eax
。如果我错了,请告诉我

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

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

这条线

   Test Eax, Eax        ;Avoid the null byte in Cmp Eax,0
…正在使用所有32位

,将代码片段转换为C伪代码如下所示

eax=0;
/*一些看不见的代码*/
while(true)
{
al=mem[esi];/*这只修改覆盖在32位eax“结构”上的较低8位*/
/*eax=(eax&0xFFFFFF00)| al*/
esi=esi+1;
如果(eax==0)
{
转到检查功能;
}
edx=edx+eax;
edx=edx^eax;
edx=edx+1;
}

一般来说,在研究一些遗留源代码时,将代码转换成另一种更简单的语言,甚至转换成图形语言(如“Rapid Quality Systems的代码火箭设计器”的作者发明的语言,请参见)是一种方法?这应该是
Loadsb
吗?或者,您可以在
Lodsb
指令之后插入
Movzx Eax,Al
指令。查看所有位可能没问题(例如,如果以前的代码确保Eax的上24位是清晰的)由于所示代码中没有任何其他内容会改变上面的24位。User3187056在他对情况的描述中包含了这句话,
“……我认为当loopsb读取所有32位值时……”
恐怕Brendan是正确的<代码>测试eax,eax,
测试al,al
,这无关紧要。所有功能需要检查的是
al
中是否存储了零。这正是代码所做的。原始海报只是要求确认他对所呈现功能的理解。