码迷,mamicode.com
首页 > 系统相关 > 详细

Linux汇编实例讲解(一)

时间:2015-05-01 09:24:55      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:汇编   as   ld   exit   linux   

       我们使用的平台是Linux系统,具体为CentOS-64位版。下面是第一个汇编程序的源码:
# 目的:退出Linux内核并返回一个简单的状态码
#
# 输入:无
#
# 输出:控制台上没有输出,可以用echo $?来查看状态码
#
# 变量:
#       %eax 保存系统调用号
#       %ebx 保存返回状态
#

.section .data
.section .text
.globl  _start

_start:
        movl    $1, %eax       #这是用于退出程序的Linux内核命令号(系统调用)
        movl    $8, %ebx       #这是返回给操作系统的状态码
                               #改变这个数字,则返回到echo $?的值会不同
        int     $0x80          #将内核唤醒,以运行退出命令



       汇编程序的汇编、链接及输出结果是:

技术分享


       Linux系统中,shell命令echo $?表示打印上一个命令执行的结果,该结果值的范围为0-255,一般将0作为命令成功执行的返回码。在该例子中我们使用的是8,而不是0,作为演示使用。
      下面我们分析一下程序中代码的具体含义:
     (1)以‘#‘号开头的为程序的注释,不会被编译或者执行;
     (2)以‘.‘开头的为汇编指令或伪操作,并不会被翻译成机器指令;
              .section .data 定义了程序的数据段的开始。数据段列出程序数据所需要的所有内存存储空间。
              .section .text 定义了程序的文本段的开始。文本段是存放程序指令的部分。
              .globl  _start _start是个特殊符号,总是使用.globl来标记,因为它标记了该程序的开始位置,即,程序的入口地址。
               _start: 定义_start标签的值。
     (3)程序指令:
              movl    $1, %eax
              将数字1移入eax寄存器。$1和%eax称为指令movl的操作数。其中$1为寻址方式中的立即寻址,如果没有$符号,则是直接寻址;%eax称为寄存器,在x86系统中有如下几个通用寄存器:
              %eax
              %ebx
              %ecx
              %edx
              %edi
              %esi
              有以下几个专用寄存器:
              %ebp
              %esp
              %eip
              %eflags

              该指令中将1放入寄存器%eax中是因为在系统调用中1对应系统调用exit;
              movl    $8, %ebx
              当程序执行结束时,程序退出的状态码保存在%ebx寄存器中,通过echo $?命令可以看到该值。
              int     $0x80
              int代表中断,0x80是要用到的中断号,该中断将会引发系统调用。该程序中即调用exit。

Linux汇编实例讲解(一)

标签:汇编   as   ld   exit   linux   

原文地址:http://blog.csdn.net/ucan23/article/details/45417441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!