你能帮我理解下面两个装配说明的目的吗?(有关更多上下文,最后是汇编+ C代码).谢谢 !
movzx edx,BYTE PTR [edx+0xa]
mov BYTE PTR [eax+0xa],dl
Run Code Online (Sandbox Code Playgroud)
===================================
汇编代码如下:
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
Run Code Online (Sandbox Code Playgroud)
===================================
下面的C源代码(不包含库):
int main() {
char str_a[100];
strcpy(str_a, "eeeeefffff");
}
Run Code Online (Sandbox Code Playgroud)
它内联strcpy()调用,代码生成器可以告诉需要复制11个字节.字符串文字"eeeeefffff"有10个字符,一个额外的零终止符.
代码优化器将复制循环展开为4次移动,移动4 + 4 + 2 + 1个字节.它需要以这种方式完成,因为没有处理器指令移动3个字节.您要求的有关复制第11个字节的说明.使用movzx有点矫枉过正,但它可能比加载DL寄存器更快.
更改字符串时,请观察生成的代码中的更改.添加一个额外的字母应该展开3个动作,4 + 4 + 4.当字符串变得太长时,你应该看到它回落到像memmove这样的东西.
| 归档时间: |
|
| 查看次数: |
2175 次 |
| 最近记录: |