2011-10-22 72 views
17

我已經在網上搜索過,但是我找不到明確的例子來理解這條指令做了什麼。所以,如果有人能夠舉一個這樣的例子,那對我來說會很有幫助。movsbl指令做什麼?

+3

這裏有不止一個彙編指令......你要處理哪一個? 86? MIPS? PPC?臂?等等......等等。? –

+0

我認爲這是ia32。 – sarslanhan

+1

和MOVZBL零擴展:http://stackoverflow.com/questions/9317922/what-does-the-movzbl-instruction-do-in-ia-32-att-syntax?lq=1 –

回答

28

移動符號從字節擴展到長字。在Intel語法中,該指令的助記符是MOVSX。

當需要將int8_t類型的變量轉換爲int時,C語言編譯器可能會使用該指令,該算法會在算術和其他一些操作(整數提升)上自動發生。由於該指令寫入目標寄存器的所有32位(或64位),因此避免了只寫入寄存器的低8位(或16位)可能導致的性能損失。一組類似的指令允許用零位擴展(英特爾語法中的MOVZX,AT & T語法中的MOVZst(從大小s到大小t))。

1

假設這是ATT彙編語法爲IA32(i386/x86_64),它意味着MOV與Sign-extension從字節到長。那就是相當於MOVSX r32, r/m83-730 Vol. 2A

14

頂級網頁命中movsblthis page,如果你搜索movsbl它說

MOVSBL and MOVZBL 
* MOVSBL sign-extends a single byte, and copies it into a 
    double-word destination 
* MOVZBL expands a single byte to 32 bits with 24 leading 
    zeros, and copies it into a double-word destination 

Example: 
%eax = 0x12345678 
%edx = 0xAAAABBBB 
MOVB %dh, %al   %eax = 0x123456BB 
MOVSBL %dh, %eax  %eax = 0xFFFFFFBB 
MOVZBL %dh, %eax  %eax = 0x000000BB 

看起來像一個非常明顯的例子給我。有關更多示例,請閱讀下一頁。

3

假設你在談論x86,MOVSBL指令擴展了一個字節(8位),表示簽名的號碼爲32位有符號數。剩下的24位依賴於符號爲零或1,因此二進制補碼值保持不變。

含義,如果你有一個負數,高24位將是1s,否則它們將爲零。

無符號數字的等價物是MOVZBL,它總是以0表示。

相關問題