到 http://www.nasm.us/ 下载最新代码
然后解压,执行:
./configure
make
sudo make install
sudo yum install glibc.i686
sudo yum install libstdc++.i686
sudo yum install glibc-devel.i686
vi hello.asm
输入:
; hello.asm
section .data ; 数据段声明
msg db "Hello, world!", 0xA ; 要输出的字符串
len equ $ - msg ; 字串长度
section .text ; 代码段声明
global main ; 指定入口函数
main: ; 在屏幕上显示一个字符串
mov edx, len ; 参数三:字符串长度
mov ecx, msg ; 参数二:要显示的字符串
mov ebx, 1 ; 参数一:文件描述符(stdout)
mov eax, 4 ; 系统调用号(sys_write)
int 0x80 ; 调用内核功能
; 退出程序
mov ebx, 0 ; 参数一:退出代码
mov eax, 1 ; 系统调用号(sys_exit)
int 0x80 ; 调用内核功能
执行汇编器:
nasm [-g] -f elf hello.asm
-g 是生产调试信息到目标文件
执行链接器:
gcc -m32 [-g] -o hello hello.o
执行最终输出的可执行程序:
./hello
将输出:
Hello, world!
调试:
gdb hello
用 list 命令查看代码:
(gdb) list
1 ; hello.asm
2 section .data ; 数据段声明
3 msg db "Hello, world!", 0xA ; 要输出的字符串
4 len equ $ - msg ; 字串长度
5 section .text ; 代码段声明
6 global main ; 指定入口函数
7 main: ; 在屏幕上显示一个字符串
8 mov edx, len ; 参数三:字符串长度
9 mov ecx, msg ; 参数二:要显示的字符串
10 mov ebx, 1 ; 参数一:文件描述符(stdout)
(gdb) list
11 mov eax, 4 ; 系统调用号(sys_write)
12 int 0x80 ; 调用内核功能
13 ; 退出程序
14 mov ebx, 0 ; 参数一:退出代码
15 mov eax, 1 ; 系统调用号(sys_exit)
16 int 0x80 ; 调用内核功能
将 main 设置为断点:
(gdb) b main
Breakpoint 1 at 0x80483f0
运行程序,然后程序执行到 main 处停下:
(gdb) r
Starting program: /home/li/hello
Breakpoint 1, 0x080483f0 in main ()
Missing separate debuginfos, use: debuginfo-install glibc-2.18-14.fc20.i686