Linux 汇编语言 HelloWorld

什么都不说了,先上代码(有 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!

参考:

[1] Linux汇编语言开发指南 https://www.ibm.com/developerworks/cn/linux/l-assembly/

猜你喜欢

转载自my.oschina.net/amhuman/blog/1619574
今日推荐