[英]AT&T assembly try to “movb” a character constant to register, core dump
我正在使用ubuntu64 + gas我使用AT&T程序集,我試圖用'e'分配al寄存器,並將其編譯成32位程序
$ cat c2.s
.code32
.globl _start
_start:
movb 'e',%al # Problem here!!!!
mov $1,%eax
mov $0,%ebx
int $0x80
$ as -g c2.s -o c2.o && ld c2.o -o c2
$ c2
分段故障(SIGSEGV)
我用gdb調試c2,發現它在movb'e',%al崩潰。 太奇怪了,“movb”會怎么樣?
然后我切換我的語法使用intel相同的內容:
$ cat b2.s
.intel_syntax noprefix
.code32
.section .text
.global _start
_start:
mov al,'e'
mov eax,1
mov ebx,0
int 0x80
$ as -g b2.s -o b2.o && ld b2.o -o b2
$ b2
這個時候沒問題。 但是,為什么我對AT&T裝配的使用有些不對勁?
不是那么有趣。 AS為AT&T語法生成此目標代碼
400078: a0 65 00 00 00 b8 01 movabs 0x1b800000065,%al
40007f: 00 00
400081: 00 bb 00 00 00 00 add %bh,0x0(%rbx)
400087: cd 80 int $0x80
顯然,位置0x1b800000065未映射,但英特爾;
400078: b0 65 mov $0x65,%al
40007a: b8 01 00 00 00 mov $0x1,%eax
40007f: bb 00 00 00 00 mov $0x0,%ebx
400084: cd 80 int $0x80
從AT&T刪除.code32就可以了。
400078: 8a 04 25 65 00 00 00 mov 0x65,%al
40007f: b8 01 00 00 00 mov $0x1,%eax
400084: bb 00 00 00 00 mov $0x0,%ebx
400089: cd 80 int $0x80
注意它是如何將內存位置0x64的內容移動到AL中的。
movb $'e',%al
解決了這個問題。 無論如何,在64位系統上開發32位代碼可能會讓你在某個時間點感到悲傷,特別是當你開始處理堆棧時。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.