如何将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
相关产品推荐
相关产品推荐

