刚学汇编语言,遇到了一个关于指针和esi的问题,请大神指教
我根据书本上的代码进行了部分改动,其代码主要是定义一个指向数组的指针,然后把这个指针送入esi中,在用方括号取得esi中的数据存入eax寄存器。以下就是一个没有问题的代码:
.386
.model flat,studcall
.stack 4096
ExitProcess PROTO, dwExitCode DWORD
.data
array1 DWORD 10,11,12,13
PDWORD typedef PTR DWORD
ptr1 PDWORD array1
.code
main PROC
mov esi,ptr1
mov eax,[esi]
INVOKE ExitProcess,0
main ENDP
END main
但是我当时就想,那我用ptr1这个指针取得array1后面几个元素,比如取得array1中的第三个元素,如果按照之前的做法,即用数组名来写的话:
mov esi,offset array1+8
mov eax,[esi]
所以我就觉得可能用指针就也是一样的吧,然后索性就把code部分改成了:
mov esi,ptr1+8
mov eax,[esi]
结果在调试的时候发现执行到第二个语句的时候esi直接变成了0x00000000。很纳闷,我后来还尝试了其他方法,就想既然指针已经定了数据类型,那是不是加的那个数不用考虑字节而是直接写成这样:
mov esi,ptr1+2
mov eax,[esi]
我猜ptr1+2可能就是表示第三个数的地址了吧。结果更有意思。在调试的时候,第一句话还没执行时,ptr1的内容是0x12408800,执行完第一句话esi的内容就变成了0x00001240。再次调试,ptr1的内容为0x0022A390,执行完第一句话esi变成0x0000022。
无论ptr1怎么变,执行完第一句话之后,esi中的内容就好像是把ptr1的内容右移4位一样。假如我要取得第二个数,我这么写:
mov esi,ptr1+1
mov eax,[esi]
那么一开始ptr1的内容为0x01442300,esi之后的内容就变成了0x00014423。相当于右移了2位。
我问了老师,他也不是很清楚是怎么回事。希望有大神可以给我解释一下吗。十分感谢。