#“#”符号为单行注释符
#
#
.section .data #data段保存程序中的数据,是可读可写的,相当于C程序中的全局变量
.section .text #text段保存代码,是可读可执行的,后面那些指令都属于.text段
.globl _start #_start 为程序的入口地址,用.globl声明会被链接器用到,
#如果一个符号没有globl声明,就表示这个符号不会被链接器用到
_start:
movl $1, %eax #mov的后缀l表示long,说明是32位的传送指令
movl $4, %ebx #立即数前面要加 $,寄存器名前面加%,以便跟符号名分开
#数据的传送方向:第一个操作数总是源操作数,第二个操作数总是目
#标操作数,所以生成一个立即数4并保存到ebx寄存器中
int $0x80
说明:.section .data 汇编程序中以 . 开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为
汇编指示或伪操作。
1、int指令称为软中断指令,可以用这条指令故意产生一个异常,异常的处理和中断类似,CPU从用户模式切换到特权模式,然后跳
转到内核代码中执行异常处理程序。
2、在linux内核中int $0x80这种异常称为系统调用(System Call)
通过系统调用切换到CPU模式,经由异常处理程序进入内核,用户程序只能通过寄存器传几个参数,
之后就要按内核设计好的代码路线走。在调用结束后,CPU再切换到用户模式,执行下一条指令。
3、eax和ebx是由传递给系统调用的两个参数,eax的值是系统调用号,linux的各种系统调用都是由int $0x80 指令引发的,内核需要
通过eax到判断用户需要哪个系统调用,_exit的系统调用号是1.ebx的值是传给_exit的参数,表示退出状态。
4、大多数系统调用完成之后会返回用户空间继续执行后面的指令,而_exit系统调用比较特殊,他会终止当前进程,而不是返回用户空间
继续执行。
编译:
$as main.s -o main.o #as把汇编程序中的助记符翻译成机器指令,生成目标文件hello.o
$ld main.o -o main #用链接器(link)ld把目标文件hello.o链接成可执行文件
$./main
$ echo $?
4 #相当于C语言中的ruturn 4
笔记摘自《Linux C 编程 一站式学习》.宋劲杉 编著