环境说明
用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
代码目录的文件如下
![在这里插入图片描述](https://img-blog.csdnimg.cn/7041b33b262541a899f8297ff3eb3ed1.png)