您的位置:首页 > 编程语言

x86 汇编程序基础

2015-07-15 08:33 232 查看
最简单的汇编程序:



这个程序只做了一件事情:退出,退出状态是 4

链接(linking):就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行。链接可以执行于编译(compile time)时,也就是在源代码被翻译成机器代码时;也可以执行于加载(load)时,也就是在程序被加载器(loader)加载到存储器并执行时。甚至执行于运行时(run time),由应用程序来执行。使得分离编译成为可能。
—— 摘自《深入理解计算机系统》

链接的两个主要作用:1. 修改目标文件中的信息,对地址做重定位。2. 把多目标文件合并成一个可执行文件。 —— 《Linux C 一站式编程学习》

.section 指示把代码分成若干个段,程序被操作系统加载执行时,每个段被加载到不同的地址,操作系统对不同的页面设置不同的读、写、执行权限。
.data 段,保存程序的数据,是可读可写的,相当于 C 的全局变量。
.text 段, 是只读和可执行的,后面的指令属于 .text 段。

_start : 是一个符号(Symbol),符号在汇编程序中代表一个地址,可以用在指令中,汇编程序在经过汇编器的处理之后(也就是成为 .o 文件),所有的符号都被替换为它所代表的真实地址值。

.globl : 指令告诉汇编器, _start 这个符号要被链接器用到,所以要在目标文件中的符号表中标记它是一个全局符号。
_start 就像 C 程序的main函数一样特殊,是整个程序的入口,链接器在链接时会查找目标文件中的 _start 符号代表的地址,把它设置为整个程序的入口地址,所以每个汇编程序都要有一个_start ,并且用 .globl声明。
如果一个符号没有被 .globl 声明,就表示这个符号不会被链接器用到。

$1 表示 cpu 内部产生一个立即数,不需要读取内存
% 表示寄存器,为了和符号名区分开

int 指令是软中断指令,可以用这条指令故意产生一个异常。异常的处理和中断类似,CPU从用户模式切换到特权模式,然后跳到内核代码中执行异常处理程序。

求一组数中的最大值,汇编代码:
汇编代码详细解释,请见《Linux C编程一站式学习》 p280,非常详细。



转为机器(指令码)码:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: