You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将AT&T汇编语法转换为NASM语法?附代码求助

AT&T 转 NASM 汇编代码及转换指南

转换后的NASM汇编代码

; 数据段定义
global _videoMemory
section .data
align 4
_videoMemory:
    dd 753664

global _screenWidth
section .rdata
align 4
_screenWidth:
    dd 80

global _screenHeight
align 4
_screenHeight:
    dd 25

; 代码段定义
section .text
global _cls
_cls:
    cfi_startproc
    push ebp
    cfi_def_cfa_offset 8
    cfi_offset ebp, -8
    mov ebp, esp
    cfi_def_cfa_register ebp
    sub esp, 16
    mov dword [ebp-4], 0
    jmp L2
L3:
    mov edx, _videoMemory
    mov eax, [ebp-4]
    add eax, edx
    mov byte [eax], 32
    mov eax, _videoMemory
    mov edx, [ebp-4]
    add edx, 1
    add eax, edx
    mov byte [eax], 7
    add dword [ebp-4], 2
L2:
    mov edx, 80
    mov eax, 25
    imul eax, edx
    add eax, eax
    cmp eax, [ebp-4]
    jg L3
    nop
    leave
    cfi_restore ebp
    cfi_def_cfa 4, 4
    ret
    cfi_endproc

global _strlen
_strlen:
    cfi_startproc
    push ebp
    cfi_def_cfa_offset 8
    cfi_offset ebp, -8
    mov ebp, esp
    cfi_def_cfa_register ebp
    sub esp, 16
    mov dword [ebp-4], 0
    jmp L5
L6:
    add dword [ebp-4], 1
    add dword [ebp+8], 1
L5:
    mov eax, [ebp+8]
    movzx eax, byte [eax]
    test al, al
    jne L6
    mov eax, [ebp-4]
    leave
    cfi_restore ebp
    cfi_def_cfa 4, 4
    ret
    cfi_endproc

global _printchar
_printchar:
    cfi_startproc
    push ebp
    cfi_def_cfa_offset 8
    cfi_offset ebp, -8
    mov ebp, esp
    cfi_def_cfa_register ebp
    sub esp, 4
    mov eax, [ebp+8]
    mov byte [ebp-4], al
    mov edx, _videoMemory
    mov eax, [ebp+12]
    add edx, eax
    movzx eax, byte [ebp-4]
    mov byte [edx], al
    nop
    leave
    cfi_restore ebp
    cfi_def_cfa 4, 4
    ret
    cfi_endproc

global _print
_print:
    cfi_startproc
    push ebp
    cfi_def_cfa_offset 8
    cfi_offset ebp, -8
    mov ebp, esp
    cfi_def_cfa_register ebp
    sub esp, 24
    mov eax, [ebp+8]
    mov [esp], eax
    call _strlen
    mov [ebp-8], eax
    mov dword [ebp-4], 0
    jmp L10
L11:
    mov eax, [ebp-4]
    add eax, eax
    mov ecx, eax
    mov edx, [ebp+8]
    mov eax, [ebp-4]
    add eax, edx
    movzx eax, byte [eax]
    movsx eax, al
    mov [esp+4], ecx
    mov [esp], eax
    call _printchar
    add dword [ebp-4], 1
L10:
    mov eax, [ebp-4]
    cmp eax, [ebp-8]
    jb L11
    nop
    leave
    cfi_restore ebp
    cfi_def_cfa 4, 4
    ret
    cfi_endproc

; 字符串常量
section .rdata
LC0:
    db 'a', 0

; 主函数
section .text
global _kmain
_kmain:
    cfi_startproc
    push ebp
    cfi_def_cfa_offset 8
    cfi_offset ebp, -8
    mov ebp, esp
    cfi_def_cfa_register ebp
    sub esp, 8
    call _cls
    mov eax, LC0
    movsx eax, byte [eax]
    mov dword [esp+4], 1
    mov [esp], eax
    call _printchar
    nop
    leave
    cfi_restore ebp
    cfi_def_cfa 4, 4
    ret
    cfi_endproc

AT&T 转 NASM 核心转换规则

  • 寄存器与立即数:AT&T寄存器带%前缀,NASM无需;AT&T立即数带$前缀,NASM直接写数值(内存寻址中的立即数除外)。
  • 指令操作数顺序:AT&T是源, 目的,NASM是目的, 源,比如movl %esp, %ebp转成mov ebp, esp。
  • 指令后缀:AT&T用后缀l/b指定操作数大小,NASM根据寄存器或操作数自动判断,直接去掉后缀,比如addl→add,movzbl→movzx。
  • 内存寻址:AT&T的disp(%reg)格式对应NASM的[reg+disp]或[reg-disp],比如-4(%ebp)→[ebp-4],8(%ebp)→[ebp+8]。
  • 伪指令:
    • .globl→global
    • .long→dd
    • .ascii "a\0"→db 'a', 0
    • .align 4→align 4
  • 调试信息:原代码中的.cfi系列指令NASM同样支持,可直接保留;.def等GCC特定调试标记可删除,不影响编译运行。

转换工具与学习资源

  • 手动转换:对于小规模代码,掌握上述规则即可快速转换,也是最可靠的方式。
  • 自动转换工具:可使用objconv工具,通过将AT&T汇编编译成目标文件,再反汇编为NASM格式,命令示例:
    gcc -c input.s -o input.o
    objconv -fnasm input.o output.asm
    
  • 学习教程:NASM官方文档包含详细的语法说明,对比AT&T语法差异进行学习,重点关注操作数顺序、寻址方式、伪指令这几个核心区别。

内容的提问来源于stack exchange,提问作者Freemotion 21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 04:05:54