出处:莱密之家
近来这些日子好像找到了昔日学习的劲头,希望能继续延续下去,让自己的大四过得充实些。
以下是这两天的汇编学习笔记:
用as来调试汇编程序时,要借助-gstabs参数来将调试信息汇编进可执行文件中;这里面要注意的是如果使用gcc的话,则是借助-g参数来实现。
在调试的过程中,如果要设置断点时,不能按照调试c语言的方法来设置断点,必须用如下的格式:b『或break』 *_start『或其它自定义的起始标签』+离_start的行数;并且起始标签后的第一条语句必须是nop『意思是空操作』,否则你所设的断点无效,这也是GUN汇编器的缺陷。
我们写的汇编程序中如果调用了C库函数时;连接时必须把库文件链接到目标代码中去;在linux系统中,有两种方法:一是静态连接,它是把目标代码直接连接到可执行的文件中去,势必会创建很大的可执行文件;二是动态连接,运行时它是由操作系统调用动态连接库,这样它可以节省空间,而且多个程序可以共享动态连接库。但是如果用gcc来编译,就可以省去这部分,因为gcc编译器是自动连接所需的C库文件。
linux下的汇编程序是由3个常用的段组成,分别是数据段、bss段、代码段。所有的汇编程序必须有代码段『其格式:.section .text』,该区域是放指令码的地方;数据段它是可选的『其格式:.section .data或.rodata』,用.data命令声明的数据段,这个段的任何数据元素都保留在内存中并且可以被汇编语言的指令读取和写入,如果用.rodata命令声明的数据段,这个段中的任何数据元素只能按照只读『read only』的方式访问;bss段声明的数据『其格式:.section .bss』是用0或null来初始化的,它有一个好处就是这部分的数据不在可执行程序中,所以它不像data段声明多少数据就占用多少空间。
linux下的数前面必须加上美元符号$才能是立即数。
linux下汇编程序中内存的变址查询模式:
base_address(offset_address,index,size)à base_address + offset_address + index * size;
当使用标签引用内存位置中包含的数据值时,前面必须通过美元符号$才能获得数据值的地址。