1. 先让程序跑起来
第一步编写以下代码:
1 .section .data #定义数据段
2 msg: #定义一个变量
3 .ascii "hello world 123 \n" #变量的内容为字符串
4
5 len=.-msg # 计算字符串的长度, 表示当前地址减去msg的地址, 得到了msg的长度
6
7 msg2: #定义一个变量
8 .ascii "bbbb\n" #变量的内容为字符串
9
10 #len=.-msg #注意, 开始我放这里算msg的长度, 结果把msg2的长度也算进去了.
11 len2=.-msg2 # 计算msg2的长度
12 .section .text # 定义代码段
13 .global _start #定义代码段入口, 相当于C 中的main函数, 如果用gcc 编译, 这里_start换成_main
14 _start: #定义代码段入口
15 movl $len, %edx #系统调用参数三, 打印的长度
16 movl $msg, %ecx # 系统调用参数二, 起始地址
17 movl $1, %ebx #系统调用的1st 参数, 标准输出fd
18 movl $4, %eax #能实现打印的系统调用号
19 int $0x80 # 执行系统调用 (15~19行相当于一个系统调用, 理解 了C中的print())
#
20
21 movl $len2, %edx
22 movl $msg2, %ecx
23 movl $1, %ebx
24 movl $4, %eax
25 int $0x80 #(同19行)
26
27 movl $0, %ebx # 返回值
28 movl $1, %eax # 退出的系统调用
29 int $0x80 #系统调用---退出
30
第二步: 编译出hello.o
as -o hello.o hello.s
第三步: 链接生成可执行文件.
ld -o hello hello.o
第四:
执行:
./hello
输出:
2. 分析下每一步在做什么.
看以上红色字体.