AT&T

【 聲明:版權所有,歡迎轉載,請勿用於商業用途。  聯繫信箱:feixiaoxing @163.com】

    同樣是x86的cpu,但是卻可以用不同形式的彙編語言來表示。在window上面我們使用的更多是intel格式的彙編語言,而在Linux系統上面使用的更多的常常是AT&T格式的彙編語言。那什麼是AT&T格式的彙編代碼呢?我們可以寫一個試試看。

[cpp] view plain copy
  1. .data  
  2.     message: .string "hello!\n"  
  3.     length = . - message  
  4.   
  5. .text  
  6. .global _start  
  7.   
  8. _start:  
  9.     movl $length, %edx  
  10.     movl $message, %ecx  
  11.     movl $1, %ebx  
  12.     movl $4, %eax  
  13.     int $0x80  
  14.   
  15.     movl $0, %ebx  
  16.     movl $1, %eax  
  17.     int $0x80  
    這是一個簡單的彙編文件,我們可以分兩步進行編譯。首先,輸入 as -gstabs -o hello.o hello.s, 接着輸入ld -o hello hello.o即可。爲了驗證執行文件是否正確,可以輸入./hello驗證一下。

    在as命令當中,由於我們使用了-gstabs選項,因此在hello執行文件中是包含調試信息的。所以,如果想單步調試的朋友可以輸入gdb hello進行調試。

    那麼,hello執行文件反彙編的代碼又是什麼樣的呢?我們可以輸入objdump -S -d hello查看一下。

[cpp] view plain copy
  1. 08048074 <_start>:  
  2. .text  
  3. .global _start  
  4.   
  5. _start:  
  6.         movl $length, %edx  
  7.  8048074:       ba 08 00 00 00          mov    $0x8,%edx  
  8.         movl $message, %ecx  
  9.  8048079:       b9 9c 90 04 08          mov    $0x804909c,%ecx  
  10.         movl $1, %ebx  
  11.  804807e:       bb 01 00 00 00          mov    $0x1,%ebx  
  12.         movl $4, %eax  
  13.  8048083:       b8 04 00 00 00          mov    $0x4,%eax  
  14.         int $0x80  
  15.  8048088:       cd 80                   int    $0x80  
  16.   
  17.         movl $0, %ebx  
  18.  804808a:       bb 00 00 00 00          mov    $0x0,%ebx  
  19.         movl $1, %eax  
  20.  804808f:       b8 01 00 00 00          mov    $0x1,%eax  
  21.         int $0x80  
  22.  8048094:       cd 80                   int    $0x80  
  23.         ret  
  24.  8048096:       c3                      ret  
  25.       

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