linux-assembly-tutorial-att

Linux汇编-笔记-AT&T

打印Hello world

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.section .rodata
msg:
.ascii "Hello, world\n"

.section .text
.global _start
_start:
# 相当于执行 write(1, msg, 13)
mov $4, %eax # 在 x86-32 下,write 的系统调用号是 1
mov $1, %edx # 第一个参数:1 是标准输出(stdout)的文件描述符
mov $msg, %ecx # 第二个参数:Hello, world 字符串的首地址(msg 标签处)
mov $13, %edx # 第三个参数:要输出数据的字节数
int $0x80 # 发起系统调用

# 相当于调用 exit(0)
mov $1, %eax # 在 x86-32 下,exit 的系统调用号是 1
mov $0, %ebx # 唯一的一个参数:0
int $0x80 # 发起系统调用

GNU的ld链接器默认入口符号是_start并且要将其设置为全局符号,用其他符号在链接时,使用ld -e 指定。

这里没有用到寄存器,因为是直接通过系统内核将hello world打印出来,没有调用系统函数printf,其中,用到了四个寄存器传参,他们的赋值顺序可以颠倒。

Linux系统调用号:

编译链接方法

这里是采用gas+AT&T语法写的,因此使用as编译,ld链接

因32位比较特殊,64位比较简单。这里以32位举例

编译: as --32 xxx.s -o xxx.o

链接: ld -m elf_i386 xxx.o -o xxx.out

Reference

在 Linux 上用 x86-64 汇编语言写 Hello World 程序(上) | 郭帅的个人博客

linux汇编知识总结(GAS和NASM汇编)_gas 汇编_鱼日天的博客-CSDN博客

GitHub-https://github.com/cirosantilli/arm-assembly-cheat


linux-assembly-tutorial-att
http://tang895.github.io/2023/04/23/linux-assembly-tutorial-att/
作者
TangYijun
发布于
2023年4月23日
许可协议