linux下彙編學習筆記[第一天]

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調試:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章