assembly - 在汇编中,linux是什么

  显示原文与译文双语对照的内容
125 1





void return_input (void)


{ 


 char array[30]; 



 gets (array); 


 printf("%sn", array); 


}




在gcc中编译后,这里函数将转换为以下汇编代码:






push %ebp


mov %esp,%ebp


sub $0x28,%esp


mov %gs:0x14,%eax


mov %eax,-0x4(%ebp)


xor %eax,%eax


lea -0x22(%ebp),%eax


mov %eax,(%esp)


call 0x8048374 


lea -0x22(%ebp),%eax


mov %eax,(%esp)


call 0x80483a4 


mov -0x4(%ebp),%eax


xor %gs:0x14,%eax


je 0x80484ac 


call 0x8048394 


leave 


ret 




我不理解两行:






mov %gs:0x14,%eax


xor %gs:0x14,%eax




什么是 %gs,这两条直线到底是什么?

这是编译命令:






cc -c -mpreferred-stack-boundary=2 -ggdb file.c




时间: 原作者:

56 2

GS是一个段 register,它在linux中的使用可以在上读取 ( 它主要用于每个进程数据) 。


mov %gs:0x14,%eax


xor %gs:0x14,%eax



这里代码用于验证堆栈没有分解或者是 corupted,使用存储在GS+0x14中的,值,见

51 2

可以用额外段寄存器作为额外的段寄存器,也可以用于跨段( 像字符串副本)的特殊指令。 从这里拍摄

http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm

希望它可以帮助

...