2016-09-26 90 views
0

設置在彙編語言編程我的理解:86分寄存器(EAX,AX,AH)是從內存中的數據

EAX : 22 66 77 55 
AX :  77 55 
AH :  77 
AL :   55 

但我真的不明白從陣列讀取數據時,它是如何工作的指針的偏移量:

.data 
arrayW WORD 1233h,2245h, 1176h 

ptr2 PWORD arrayW 

.code 
    mov esi, ptr2 
    mov ax, [esi] 
    mov ah, [esi + 1] 
    mov ax, [esi + 2] 
    mov eax, [esi + 2] 

MOV AX,[ESI]寄存器EAX = 12331233.我想寄存器EAX將是000?

此外,MOV AX,[ESI + 2]寄存器= EAX = 12334455.我不明白寄存器如何成爲12334455.

可有人請給我解釋一下所有的值執行後會有寄存器嗎?

回答

2

請參閱Assembly programming memory Allocating EAX vs Ax, AH, AL瞭解AX,AH和AL如何重疊爲EAX的子集。

寫入部分寄存器(AX,AH或AL)不會修改EAX的其餘部分。 (在64位模式下,writing EAX does zero the upper half of RAX

因此mov ax, [esi]保留EAX的前2個字節未修改,並用AX = 0x1233替換低2字節。這意味着AH = 0x12和AL = 0x33,EAX = 0x22 66 12 33


字節在存儲器是小端,所以mov ah, [esi + 1]負載0×12(的0x1233高位字節,該陣列的第一個字。)

這是彙編語言。一切都只是字節。他們按順序到達那裏並不重要,因爲您使用的是WORD 1233h,2245h而不是BYTE 33h,12h, 45h, 22h。 CPU不知道或關心該指令的任何「含義」,它只從[esi+1]加載1個字節,並將其放入AH中。 (從mov ax, [esi]已經有這個值)。

寄存器中的字節沒有字節序,因爲它們沒有地址。左移總是乘以2,右移總是被2除(朝向-Infinity舍入,與有符號整數除法不同)。


又見標籤維基更多的FAQ問題,並鏈接到文件和指南。

您可以隨時將此代碼放入程序並在調試器中運行,以便在單步執行時觀察寄存器值的變化。如果你不確定會發生什麼,那就去做吧。


順便說一句,mov esi, ptr2是愚蠢的。 mov esi, offset arrayW會做同樣的事情,而不需要從數據存儲器加載指針。

+0

'mov ah,[esi + 1]'執行後寄存器的值發生了變化嗎?因爲它是WORD所以[esi + 1]沒有指向任何正確的東西? [esi + 2]指向第二個元素? – student001

+0

@ student001:這是彙編語言。一切都只是字節。他們按順序到達那裏並不重要,因爲你使用了'WORD 1233h,2245h'而不是'BYTE 33h,12h,45h,22h'。 CPU不知道或關心指令的任何「含義」,它只從'[esi + 1]'加載1個字節。 –

+0

對不起,我是新手。但我只是想確保我明白。所以如果我使用'DWORD 12344h' ='BYTE 44h,23h,01h'。是對的嗎?還有一個,'BYTE 1,2,3,4' ='WORD 4321h'? – student001

相關問題