2016-09-26 48 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

相关问题