杂记之Linux汇编语言(AT&T语法)(一)

#“#”符号为单行注释符

#

#

.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 编程 一站式学习》.宋劲杉  编著

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值