我的第一个汇编程序(X64,AT&T)

Posted xky1306102chenhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的第一个汇编程序(X64,AT&T)相关的知识,希望对你有一定的参考价值。

  1. 代码:
#hello.s
.data
    msg : .string "hello world\\n"
    len = . - msg
.text
.global _start

_start:
    movl $len, %edx
    movl $msg, %ecx
    movl $1, %ebx
    movl $4, %eax
    int 0x80
    
    movl $0, %ebx
    movl $1, %eax
    int 0x80
  1. 汇编gcc hello.s -c -o hello.o
  2. 链接ld hello.o -o hello(gcc hello.o -o hello会报"_start被多次定义",“对main未定义的引用”)
  3. int $0x80是AT&T语法中的一条中断指令,用于Linux的系统调用
  4. Linux write系统调用的原型:
ssize_t write(int fd, const void *buf, size_t count);
fd, 文件描述符,1表示标准输出,即输出到控制台
buf, 缓冲区指针
count, 写到文件fd的字节数
  1. syscall x86上的Linux 接口声明您将syscall数字加载到其中eax,并放置其他参数ebx,ecx依此类推

以上是关于我的第一个汇编程序(X64,AT&T)的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 AT&T 汇编代码会出现分段错误?

与 AT&T 相比,英特尔汇编语法的局限性 [关闭]

编写 AT&T 程序集以使用奇偶校验标志和偏移量

为啥在 x64 程序集中将复制变量地址移动到寄存器?

如何解决错误:我的代码中出现分段错误(核心转储)? AT&T 语法

x64 汇编中的递归阶乘子例程导致堆栈溢出