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