【 聲明:版權所有,歡迎轉載,請勿用於商業用途。 聯繫信箱:feixiaoxing @163.com】
同樣是x86的cpu,但是卻可以用不同形式的彙編語言來表示。在window上面我們使用的更多是intel格式的彙編語言,而在Linux系統上面使用的更多的常常是AT&T格式的彙編語言。那什麼是AT&T格式的彙編代碼呢?我們可以寫一個試試看。
-
.data
-
message: .string "hello!\n"
-
length = . - message
-
-
.text
-
.global _start
-
-
_start:
-
movl $length, %edx
-
movl $message, %ecx
-
movl $1, %ebx
-
movl $4, %eax
-
int $0x80
-
-
movl $0, %ebx
-
movl $1, %eax
-
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查看一下。
-
08048074 <_start>:
-
.text
-
.global _start
-
-
_start:
-
movl $length, %edx
-
8048074: ba 08 00 00 00 mov $0x8,%edx
-
movl $message, %ecx
-
8048079: b9 9c 90 04 08 mov $0x804909c,%ecx
-
movl $1, %ebx
-
804807e: bb 01 00 00 00 mov $0x1,%ebx
-
movl $4, %eax
-
8048083: b8 04 00 00 00 mov $0x4,%eax
-
int $0x80
-
8048088: cd 80 int $0x80
-
-
movl $0, %ebx
-
804808a: bb 00 00 00 00 mov $0x0,%ebx
-
movl $1, %eax
-
804808f: b8 01 00 00 00 mov $0x1,%eax
-
int $0x80
-
8048094: cd 80 int $0x80
-
ret
-
8048096: c3 ret
-