linux-assembly-tutorial-att
Linux汇编-笔记-AT&T 打印Hello world .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