ubuntu下使用nasm写汇编的尝试与记录
环境说明
用parallels 虚拟器安装的 ubuntu 22.04
parallels@dev:~/temp$ uname -a Linux dev 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
汇编与链接
如上图所示,汇编代码码会经过汇编器汇编成目标文件,然后目标文件再经过链接器链接成可执行文件。 汇编源代码文件有两种格式,一个是unix下的AT$T格式,另一个是window下的Intel格式。PS: unix系统下也可以用intel格式去写汇编代码。 下面将用网络上的源码代做个操作演示
AS 汇编器
专门处理AT&T格式
NASM汇编器
可以处理两种汇编格式
操作示例
AT&T示例
代码文件 hello-AT.asm
# AT&T 格式 # Hello.s .data # 数据段声明 msg : .string "Hello World!\n" # 要输出的字符串 len = . - msg # 字符串长度 .text # 代码段声明 .global _start # 指定入口函数 _start: # 在屏幕上显示一个字符串 movl $len, %edx # 参数三:字符串长度 movl $msg, %ecx # 参数二:要显示的字符串 movl $1, %ebx # 参数一:文件描述符(stdout) movl $4, %eax # 系统调用号(sys_write) int $0x80 # 调用内核功能 # 退出程序 movl $0, %ebx # 参数一:退出代码 movl $1, %eax # 系统调用号(sys_exit) int $0x80 # 调用内核功能
操作指令
as -o hello_AT.o hello-AT.asm ld -s -o~ hello_AT hello_AT.o ./hello_AT
Intel示例
代码文件 hello-Intel.asm
; 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 ; 调用内核功能
操作指令
// 如果是32位,就是elf nasm -f elf64 hello-Intel.asm ld -s -o hello_Intel hello-Intel.o ./hello_Intel
代码目录的文件如下

参考文档
上一篇:
通过多线程提高代码的执行效率例子