合作伙伴

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 10|回复: 0

GAS(GNU as)汇编初学者入门笔记:从环境搭建到第一个程序

[复制链接]
avatar

26

主题

0

回帖

106

积分

注册会员

积分
106
发表于 2026-9-12 12:53:42 | 显示全部楼层 |阅读模式
GAS(GNU as)汇编初学者入门笔记:从环境搭建到第一个程序

最近在折腾复古系统编程,发现GNU Assembler (GAS)是个很有意思的工具,整理了一下入门笔记分享给同样初学的朋友。

一、什么是GAS?

GAS 是 GNU 项目的汇编器,它支持多种架构(x86、ARM、RISC-V等),是 GCC 工具链的核心组件之一。和大家熟悉的 NASM/MASM 不同,GAS 使用 AT&T 语法,风格上有一些差异。

二、环境搭建


  1. # Debian/Ubuntu 安装
  2. sudo apt install binutils

  3. # 验证安装
  4. as --version
复制代码


在 DOS 复古环境下,可以用 DJGPP 工具链,它自带 GAS 的 DOS 移植版,适合在真机器上跑 32 位保护模式程序。

三、AT&T语法 vs Intel语法

刚从 NASM 转过来的朋友最容易混淆的就是语法差异:

对比项AT&T (GAS)Intel (NASM)
源/目标顺序movl %eax, %ebxmov ebx, eax
寄存器前缀%eaxeax
立即数前缀$0x100x10
操作数长度movl (l=32位)dword ptr


四、第一个程序:Hello World

新建 hello.s:


  1. .data
  2. msg:
  3.     .ascii "Hello, GAS!
  4. "
  5.     len = . - msg

  6. .text
  7. .global _start

  8. _start:
  9.     #  write(1, msg, len)
  10.     movl $4, %eax      # sys_write
  11.     movl $1, %ebx      # fd = stdout
  12.     movl $msg, %ecx    # buffer
  13.     movl $len, %edx    # length
  14.     int  $0x80

  15.     # exit(0)
  16.     movl $1, %eax      # sys_exit
  17.     movl $0, %ebx      # return 0
  18.     int  $0x80
复制代码


编译运行:

  1. as --32 -o hello.o hello.s
  2. ld -m elf_i386 -o hello hello.o
  3. ./hello
复制代码


五、初学者常见坑

  • 忘记操作数长度后缀(.l/.b/.w)导致汇编错误
  • 寄存器和立即数忘记加 % 和 $ 前缀
  • 伪指令以点开头(.data/.text/.global),别和指令搞混
  • int 0x80 调用号和参数顺序容易记错


六、调试技巧

用 gdb 调试汇编程序非常方便:

  1. gdb ./hello
  2. break _start
  3. run
  4. stepi  # 单步执行
  5. info registers
复制代码


共勉,欢迎大佬补充指正!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点亮中国·祝福祖国有奖可领

Archiver|手机版|小黑屋|Tve9mrft - 老旧软硬件论坛 |网站地图

GMT+8, 2026-10-6 23:04 , Processed in 0.035760 second(s), 14 queries , Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表