1
我使用的是ubuntu64 + gas 我使用AT & T程序集,我試圖給一個'e'分配al寄存器,並將其編譯爲32位程序AT&T大會嘗試「movb」一個字符常量註冊,核心轉儲
$貓c2.s
.code32
.globl _start
_start:
movb 'e',%al # Problem here!!!!
mov $1,%eax
mov $0,%ebx
int $0x80
$爲-g c2.s -o c2.o & & LD c2.o -o C2
$ C2
分段故障(SIGSEGV)
我用gdb調試C2,並發現它在崩潰MOVB 'E',%人。很奇怪,「movb」怎麼會崩潰?
然後我打開我的語法使用英特爾相同的內容:
$貓b2.s
.intel_syntax noprefix
.code32
.section .text
.global _start
_start:
mov al,'e'
mov eax,1
mov ebx,0
int 0x80
爲$ -g b2.s -o b2.o & & LD B2。 Ø-o B2
$ B2
這時間,沒問題。但是爲什麼,我的AT & T組件有什麼問題?
聽起來很奇怪,你可以再次組裝第一個例子,並使用'objdump -d file.o'來查看實際的操作碼嗎?對第二種情況做同樣的事情,並進行比較。一見鍾情,他們看起來和我完全一樣。 – Ped7g
你不應該需要'.code32'指令。將'--32'傳遞給彙編程序以彙編32位代碼; '.code32'只會改變彙編器識別和彙編的內容,但不會使輸出成爲32位的目標文件。 – fuz