簡體   English   中英

匯編指令addl使用字節代替long

[英]Assembly instruction addl using byte instead of long

我現在正在研究使用objdump從簡單的c程序編譯的匯編代碼,但這使我感到困惑:

 4004f1:       c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%rbp)
 4004f8:       83 45 fc 05             addl   $0x5,-0x4(%rbp)

指令中的'l'前綴不是很長時間,因為movl看起來不錯,但是addl似乎對操作數使用單個字節,這是為什么呢?

許多對立即數進行操作的指令可以具有8位立即數或32位立即數(尤其是mov r/m32,i32沒有)。 此設計的目的可能是減少代碼大小。 但是,立即數被隱式符號擴展為32位。 在的情況下add ,操作碼83 /0add與8位的立即,操作碼81 /0add有32位立即。 匯編器應自動選擇最短的編碼。 您可以組裝這個小片段,然后分解結果以觀察差異:

.byte 0x83,0xc0,0x00 # addl $0,%eax with an 8 bit immediate
.byte 0x81,0xc0,0x00,0x00,0x00,0x00 # addl $0,%eax with a 32 bit immediate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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