簡體   English   中英

AT&T程序集試圖“移動”一個字符常量來注冊核心轉儲

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM