你能帮助我理解下面两个装配说明的目的吗?(有关更多上下文,请在末尾使用assembly+C代码)。谢谢!

movzx  edx,BYTE PTR [edx+0xa]
mov    BYTE PTR [eax+0xa],dl

===================================
程序集代码如下:
push   ebp
mov    ebp,esp
and    esp,0xfffffff0
sub    esp,0x70
mov    eax,gs:0x14
mov    DWORD PTR [esp+0x6c],eax
xor    eax,eax
mov    edx,0x8048520
lea    eax,[esp+0x8]
mov    ecx,DWORD PTR [edx]
mov    DWORD PTR [eax],ecx
mov    ecx,DWORD PTR [edx+0x4]
mov    DWORD PTR [eax+0x4],ecx
movzx  ecx,WORD PTR [edx+0x8]
mov    WORD PTR [eax+0x8],cx
movzx  edx,BYTE PTR [edx+0xa]    ; instruction 1
mov    BYTE PTR [eax+0xa],dl     ; instruction 2
mov    edx,DWORD PTR [esp+0x6c]
xor    edx,DWORD PTR gs:0x14
je     804844d <main+0x49>
call   8048320 <__stack_chk_fail@plt>
leave
ret

===================================
下面的C源代码(不包含库):
int main() {
    char str_a[100];
    strcpy(str_a, "eeeeefffff");
}

最佳答案

它内联了strcpy()调用,代码生成器可以告诉您需要复制11个字节字符串文字“eeeee fffff”有10个字符,其中一个额外字符用于零结束符。
代码优化器将复制循环展开为4个移动,移动4+4+2+1字节需要这样做,因为没有移动3字节的处理器指令。你询问的关于复制第11个字节的指令。使用movzx有点过火,但它可能比加载DL寄存器快。
更改字符串时,请注意生成代码中的更改。增加一个额外的字母应该展开到3个移动,4+4+4。当绳子太长的时候,你应该看到它落回像memmove这样的东西。

关于c - 一些组装说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18300659/

10-11 21:25