TITLE Pointers
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
myBytes BYTE 10h,20h,30h,40h
myWords WORD 8Ah,3Bh,72h,44h,66h
myDoubles DWORD 1,2,3,4,5
myPointer DWORD myDoubles ;定义指向DWORD数组的指针
.code
main PROC
;mov esi,OFFSET myBytes ;ESI=
;mov al,[esi] ;AL=
;mov al,[esi+3] ;AL=
;mov esi,OFFSET myWords+2 ;ESI=
;mov ax,[esi] ;AX=
;mov edi,8 ;EDI=
;mov edx,[myDoubles+edi] ;EDX=
;mov edx,myDoubles[edi] ;EDX=
;mov ebx,myPointer ;EBX=
;mov eax,[ebx+4] ;EAX=
;-----------------------------------
mov esi,OFFSET myBytes ;ESI=
mov ax,[esi] ;AX=
mov eax,DWORD PTR myWords ;EAX=
mov esi,myPointer ;ESI=
mov ax,[esi+2] ;AX=
mov ax,[esi+6] ;AX=
mov ax,[esi-4] ;AX=
INVOKE ExitProcess,0
main ENDP
END main
调试过程中寄存器变化情况如下
myBytes BYTE 10h,20h,30h,40h
myWords WORD 8Ah,3Bh,72h,44h,66h
myDoubles DWORD 1,2,3,4,5
myPointer DWORD myDoubles
ESI=0x00c04000
AL=0x10'\x10' ;\x10指的是十六进制下的10
AL=0x40'\x@'
ESI=0x00c04006 ;在原有偏移量的基础上+2
AX=0x003b
EDI=0x00000008
EDX=0x00000003
EDX=0x00000003
EBX=0x00c0400e ;e指的是myDoubles之前的myBytes与myWords数组的大小14个字节
EAX=0x00000002 ;一个DWORD的大小相当于4*BYTE所以首地址加上4之后EAX存储2
ESI=0x00dc4000 ;ESI存储的是myBytes的首地址,也就是它相对于数据段的偏移量
AX=0x2010 ;AX是2010,由于x86模式的电脑是小端存储方式,[ESI]赋值给AX之后需要
;一次传给AX四个16进制符号,也就是需要将 10 20两个数字传送给AX,但
;是因为small endian 的存储模式,导致这两个字节的顺序与定义相反
EAX=0x008a ;一个指向myWords的指针的内存地址
ESI=0x00dc400e
AX=0 ;AX变化结果原因暂时不明确
AX=0
AX=44