刚学汇编语言,遇到了一个关于指针和esi的问题,请大神指教

Universe_Reo 2019-05-22 02:17:12
我根据书本上的代码进行了部分改动,其代码主要是定义一个指向数组的指针,然后把这个指针送入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位。

我问了老师,他也不是很清楚是怎么回事。希望有大神可以给我解释一下吗。十分感谢。
...全文
162 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
一开始ptr1的内容为0x01442300,esi之后的内容就变成了0x00014423
============================================

从ptr1开始的数据 00 23 44 01 xx xx ...
mov esi,ptr1+1, esi就指向了23开始的地址,之后那个xx不属于ptr1了,只是恰好为0
Universe_Reo 2019-05-22
  • 打赏
  • 举报
回复
引用 2 楼 zara 的回复:
ptr1+? 是把 ptr 当做数组了,取相应偏移处的数据,但实际是 ptr 就是个指针,指向处才是数组,所以只能在第二个指令上使用 +? 进行偏移取某元素数据。
这个结果,只要看最后运行时的指令就能看出来的。
非常感谢你的回复。 那指针加上一个数的话,它的意义是什么呢?是使它原有的内容位移么?我不太清楚这种做法是否有一个确定的意义。
Universe_Reo 2019-05-22
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
ptr1是一个指针,指针值指向array1
所以你
mov esi,ptr1+8
取的是ptr1的地址+8的那个地址
直接
lea esi,[array1+8]
就可以了
非要用指针的话
mov esi,ptr1
mov eax,[esi+8]
非常感谢你的回复!我们老师也是和我说,非要用指针就在第二句话那里用。 但是我还是想问一下,指针加上一个数为什么得到的结果却好像是发生了右移?一般有这种操作吗? 主要纠结在指针加上一个数结果为什么会是那样这个问题上。
zara 2019-05-22
  • 打赏
  • 举报
回复
ptr1+? 是把 ptr 当做数组了,取相应偏移处的数据,但实际是 ptr 就是个指针,指向处才是数组,所以只能在第二个指令上使用 +? 进行偏移取某元素数据。
这个结果,只要看最后运行时的指令就能看出来的。
  • 打赏
  • 举报
回复
ptr1是一个指针,指针值指向array1
所以你
mov esi,ptr1+8
取的是ptr1的地址+8的那个地址
直接
lea esi,[array1+8]
就可以了
非要用指针的话
mov esi,ptr1
mov eax,[esi+8]

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧