什么都不说了,先上代码(有 AT&T 和 Intel 两种格式,我还是习惯用后者):
; hello.asm
section .data ; 数据段声明
msg db "Hello, world!", 0xA ; 要输出的字符串
len equ $ - msg ; 字串长度
section .text ; 代码段声明
global _start ; 指定入口函数
_start: ; 在屏幕上显示一个字符串
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 ; 调用内核功能
然后是工具:
因为用的是Intel的格式,需要安装nasm。
$ sudo apt install nasm
然后是编译:
nasm -f elf helloworld.asm
连接时遇到一个问题,当前操作系统是64位的,而我写的是32位的代码:
$ ld -s -o hello helloworld.o
ld: i386 architecture of input file `helloworld.o' is incompatible with i386:x86-64 output
所以要加-m参数:
$ ld --help
...
-m EMULATION Set emulation
...
ld: supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
...
最后,“Hello,world!”终于出现在屏幕上:
$ ld -s -melf_i386 -o hello helloworld.o
$ ./hello
Hello, world!
参考: