4.汇编语言程序设计
汇编语言程序由定义好的段组成,三个常用的段如下:数据段,bss段,文本段
所有的汇编程序必须有文本段。数据段声明带有初始值的数据元素,这些数据时汇编程序中的变量。bss声明使用零或者null初始化的数据元素,最常用作汇编语言程序中的缓冲区。
段的定义:
使用.section命令来声明段:
.section.data
.section.bss
.section.text
bss必须在文本段之前
起始点:_start 用于表明程序应该从这条指令开始运行
汇编程序的模板:
.section.data
<...>
.section.bss
<...>
.section.text
.global _start
_start:
<...>
创建简单的程序:
CPUID指令:用于请求处理器的特定信息并且把信息返回到特定寄存器中。处理器把厂商ID字符串返回到EBX,EDX和ECX寄存器中:
- EBX包含字符串的最低4个字节
- EDX包含字符串的中间4个字节
- ECX包含字符串的最高4个字节
系统调用:int $0x80 从Linux内核访问五年控制台显示
运行汇编程序:
as -o cpuid.o cpuid.s
ld -o couid cpuid.o
./cpuid
调试程序:
为了调试程序必须使用-gstabs参数重新汇编源代码:
as -gstabs -o cpuid.o cpuid.s
ld -o cpuid cpuid.o
通过指定-gstabs参数,附加的信息被汇编进可执行程序中,但是会增加程序文件大小,所以尽量不要使用调试信息。
nop:用于表示空指令
连接C库函数
- 静态链接
- 动态链接
在Linux系统中,标准的C动态库位于libc.so.x文件中(x表示库的版本),使用gcc时这个文件自动连接到C程序,必须手动地把它链接到城西目标代码以便C函数能够操作—使用-l参数
as -o cpuid.o cpuid.s
ld -o couid -lc cpuid.o
./cpuid
gcc -o cpuid2 cpuid2.s
./cpuid2