Linux下汇编学习-1

教材:programming_from_the_ground_up.pdf

直接看代码:

#PURPOSE:       Simple program that exits and returns a
#               status code back to the Linux kernel
#

#INPUT:         none
#

#OUTPUT:        returns a status code. This can be viewed
#               by typing
#
#               echo $?
#
#               after running the program
#

#VARIABLES:
#               %eax holds the system call number
#               %ebx holds the return status
#

.section .data

.section .text
.globl _start
_start:
        movl $1, %eax   # this is the linux kernel command
                        # number (system call) for exiting
                        # a program

        movl $0, %ebx   # this is the status number we will
                        # return to the operating system.
                        # Change this around and it will
                        # return different things to
                        # echo $?

        int $0x80       # this wakes up the kernel to run
                        # the exit command
我们给这个名字取名为exit.s,这个程序什么也没有做,只是调用了linux的一个exit系统调用,程序返回值为0,这个值我们可以通过命令echo$?去查看。.section命令用于定义一个段,我们这里定义了两个段,一个.data段,一个.text段。_start它是一个符号,它是汇编程序的入口点,相当于c程序的main函数,.globl的意思是指明_start是一个全局符号,这个符号要被链接器用到。然后给eax寄存器传递了一个值1,AT&T语法中规定寄存器前面要加%符号,立即数前面要加上$符号,传递的1表示使用的exit系统调用,然后给ebx寄存器传送了一个值0,ebx寄存器值用于返回给操作系统。int指令是典型的中断指令,0x80是它的中断号。
然后我们编译这个程序。使用as命令

as exit.s -o exit.o
然后链接这个程序,使用ld命令
ld exit.o -o exit
然后运行这个程序
./exit
查看程序返回状态是不是我们分析的0
echo $?
打印出来确实是0,看来我们前面分析的是正确的。

你可能感兴趣的:(Linux下汇编学习-1)