汇编语言:简单示例程序讲解

本文最后更新于:2022年9月4日 下午

最简单的汇编程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.section .data
.section .text
.globl _start
_start:
movl $1, %eax # this is the linux kernel command
# number (system call) for exiting
# a program
movl $4, %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
  • 编写完成后,通过as指令汇编为.o文件,然后通过ld指令链接为可执行文件
  • 该汇编程序的本质:
    • 将退出状态设置为4
    • shell中使用$?得到退出的状态码可以检测退出状态
  • #表示注释
  • .开头的表示伪指令
    • .data段保存程序的数据,是可读可写的,C程序的全局变量也属于.data段。本程序中没有定义数据,所以.data段是空的。
    • .text段保存代码,是只读和可执行
  • 符号(Symbol)
    • 符号在汇编程序中代表一个地址。汇编程序经过汇编器的处理之后,所有的符号都被替换成它所代表的地址值
    • 变量名和函数名都是符号,本质上是代表内存地址的
      • 通过变量名访问一个变量,本质是读写某个地址的内存单元
      • 通过函数名调用一个函数,其实就是跳转到该函数第一条指令所在的地址
  • _start
    • 是一个地址,整个程序的入口
    • .globl指示告诉汇编器,_start这个符号要被链接器用到
  • int指令称为软中断指令,可以用这条指令故意产生一个异常,从而从用户态下陷到内核态
    • int指令中的立即数0x80是一个参数,触发系统调用
    • eax和ebx寄存器的值是传递给系统调用的两个参数
      • eax的值是系统调用号,1对应_exit系统调用
      • ebx的值是传给_exit系统调用的参数,也就是退出状态

求一组数的最大值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.section .data
data_items:
.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0 #
.section .text
.global _start

_start:
movl $0,%edi
movl data_items(,%edi,4), %eax
movl %eax,%ebx

start_loop:
cmpl $0,%eax
je loop_exit
incl %edi
movl data_items(,%edi,4),%eax #将当前数组的数字放到eax总
cmpl %ebx,%eax#比较ebx和eax储存的数字的大小
jle start_loop#如果ebx更大那么直接下一次循环
movl %eax,%ebx#如果eax更大那么把eax中数字放到ebx中
jmp start_loop

loop_exit:
mov $1,%eax
int $0x80
  • data_items是数组的首地址
  • edi的值是数组的下标
  • 4表示数组的每个元素占4字节,数组中第edi个元素的地址是data_items + edi * 4
  • ebx寄存器保存到目前为止找到的最大值
  • eax寄存器保存当前要比较的数

汇编语言:简单示例程序讲解
http://gls.show/p/2fa8408d/
作者
郭佳明
发布于
2022年9月4日
许可协议