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,非常详细。
转为机器(指令码)码:
这个程序只做了一件事情:退出,退出状态是 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,非常详细。
转为机器(指令码)码:
相关文章推荐
- 20个代码生成框架
- python实现爬虫下载美女图片
- 对象引用与对象的区别
- Java学习——传说中的13个规范
- 《Java程序性能优化:让你的Java程序更快、更稳定》
- 《Java程序性能优化:让你的Java程序更快、更稳定》
- 微软ASP.NET站点部署指南(2):部署SQL Server Compact数据库
- 微软ASP.NET站点部署指南(3):使用Web.Config文件的Transformations
- 微软ASP.NET站点部署指南(8):部署Code-Only更新
- 微软ASP.NET站点部署指南(9):部署数据库更新
- Java中ArrayList和LinkedList区别
- 为每个应用程序池单独设置aspnet.config配置文件
- java位运算大全
- 利用Elmah和Google体验一把入侵的快感
- Java线程及多线程技术及应用
- JAVA的面向对象编程
- Java程序设计
- JAVA词汇大全
- CODE ---代码助手 (保存代码、搜代码、生成网页、自由界面)
- 关于php中携带的php-fpm和php-cgi的理解纠正