DOS/Windows 下的彙編語言代碼都是 Intel 風格的。但在 Unix 和 Linux 系統中,更多采用的還是 AT&T 格式,兩者在語法格式上有着很大的不同:(可以參考下面的網站)
http://www.ibm.com/developerworks/cn/linux/l-assembly/
intel 風格代碼:
; hello.asm section .data ; 數據段聲明 msg db "Hello, world!", 0xA ; 要輸出的字符串 len equ $ - msg ; 字串長度 section .text ; 代碼段聲明 global _start ; 指定入口函數 _start: ; 在屏幕上顯示一個字符串 mov edx, len ; 參數三:字符串長度 mov ecx, msg ; 參數二:要顯示的字符串 mov ebx, 1 ; 參數一:文件描述符(stdout) mov eax, 4 ; 系統調用號(sys_write) int 0x80 ; 調用內核功能 ; 退出程序 mov ebx, 0 ; 參數一:退出代碼 mov eax, 1 ; 系統調用號(sys_exit) int 0x80 ; 調用內核功能AT&T 風格代碼:
#hell.s .data # 數據段聲明 msg : .string "Hello, world!\\n" # 要輸出的字符串 len = . - msg # 字串長度 .text # 代碼段聲明 .global _start # 指定入口函數 _start: # 在屏幕上顯示一個字符串 movl $len, %edx # 參數三:字符串長度 movl $msg, %ecx # 參數二:要顯示的字符串 movl $1, %ebx # 參數一:文件描述符(stdout) movl $4, %eax # 系統調用號(sys_write) int $0x80 # 調用內核功能 # 退出程序 movl $0,%ebx # 參數一:退出代碼 movl $1,%eax # 系統調用號(sys_exit) int $0x80 # 調用內核功能彙編器:
AT&T風格代碼用gas:它是
GCC 所依賴的後臺彙編工具,通常包含在 binutils 軟件包中。GAS 使用標準的 AT&T 彙編語法
eagle@eagle-QJC4:~/workspace/assembly$ as -o hell.o hell.s -g
intel風格代碼用nasm:
eagle@eagle-QJC4:~/workspace/assembly$ nasm -f elf64 hello.asm -g
* bin flat-form binary files (e.g. DOS .COM, .SYS)
aout Linux a.out object files
aoutb NetBSD/FreeBSD a.out object files
coff COFF (i386) object files (e.g. DJGPP for DOS)
elf32 ELF32 (i386) object files (e.g. Linux)
elf ELF (short name for ELF32)
elf64 ELF64 (x86_64) object files (e.g. Linux)
as86 Linux as86 (bin86 version 0.3) object files
obj MS-DOS 16-bit/32-bit OMF object files
win32 Microsoft Win32 (i386) object files
win64 Microsoft Win64 (x86-64) object files
rdf Relocatable Dynamic Object File Format v2.0
ieee IEEE-695 (LADsoft variant) object file format
macho NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X object files
鏈接器:
eagle@eagle-QJC4:~/workspace/assembly$ ld -o hello hello.o -g
調試器:
Linux 下調試彙編代碼既可以用 GDB、DDD 這類通用的調試器,也可以使用專門用來調試彙編代碼的 ALD(Assembly Language Debugger)。
從調試的角度來看,使用 GAS 的好處是可以在生成的目標代碼中包含符號表(symbol table),這樣就可以使用 GDB 和 DDD 來進行源碼級的調試了。要在生成的可執行程序中包含符號表,可以採用下面的方式進行編譯和鏈接:
<span style="font-size:18px;">eagle@eagle-QJC4:~/workspace/assembly$<span style="font-family: Arial, Helvetica, sans-serif;">as --gstabs -o hell.o hell.s</span></span>
<span style="font-size:18px;">eagle@eagle-QJC4:~/workspace/assembly$<span style="font-family: Arial, Helvetica, sans-serif;">ld -o hell hell.o</span></span>
執行 as 命令時帶上參數 --gstabs 可以告訴彙編器在生成的目標代碼中加上符號表,同時需要注意的是,在用 ld 命令進行鏈接時不要加上 -s 參數,否則目標代碼中的符號表在鏈接時將被刪去。
在 GDB 和 DDD 中調試彙編代碼和調試 C 語言代碼是一樣的
下圖爲gdb調試: