2010-11-11 76 views
0

我有一個值爲0x01ABCDEF(十六進制值)的寄存器ecx 我想訪問只是BYTE 2(AB)爲了執行操作。 我曾嘗試使用CL或CH,但那些不訪問正確的字節。 我想這樣做:X86嵌入式彙編,訪問寄存器的特定部分

mov bh, [ecx+2] 

,但它只是錯誤了...... 謝謝你在先進的時間和幫助!

回答

2

是 - CL會給你EF和CH會給你在你上面所給定的值CD。既然你不想這些,你就必須做一個轉變,以獲得字節在正確的地方:

mov ebx, ecx 
shr ebx, 8 

現在BH將有AB和BL將有CD

編輯:從您的評論,你顯然並不真正需要在BH價值 - 相反,你只是想操縱這個特定字節,而不會影響ECX的其餘部分。在這種情況下,它可能是最容易做的是這樣的:

ror ecx, 16 
not cl // placeholder for the manipulation 
rol ecx, 16 

這只是旋轉ECX,所以我們關心的字節是CL,然後操縱CL,然後旋轉ECX回去,這樣字節是從何時開始的。我應該補充一點,雖然這很簡單,但在某些處理器上它會很慢。 Pentium IV沒有桶式移位器,所以旋轉需要的時間與移動的位數成正比。更糟糕的是,操縱CL然後使用ECX可以(在這種情況下可能會)導致Partial Register Stall。這對你是否重要取決於你試圖完成什麼,以及它是否會被PRS期間可以執行的其他指令所包圍。

+0

這個工程,但是然後我失去了其餘的ebx的內容,我需要把改變後的值放回到ecx(所以只需把更改的AB字節 – Quentin 2010-11-11 20:49:29

+0

謝謝編輯!在這種情況下速度不是問題任務),所以它應該沒問題! – Quentin 2010-11-11 21:44:54