[英]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 /0
是add
與8位的立即,操作碼81 /0
被add
有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.