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

[复制链接]
查看11 | 回复5 | 2021-1-27 05:18:47 | 显示全部楼层 |阅读模式
我根据书本上的代码进行了部分改动,其代码主要是定义一个指向数组的指针,然后把这个指针送入esi中,在用方括号取得esi中的数据存入eax寄存器。以下就是一个没有问题的代码:
.386
.modelflat,studcall
.stack4096
ExitProcessPROTO,dwExitCodeDWORD
.data
array1DWORD10,11,12,13
PDWORDtypedefPTRDWORD
ptr1PDWORDarray1
.code
mainPROC
movesi,ptr1
moveax,[esi]
INVOKEExitProcess,0
mainENDP
ENDmain
但是我当时就想,那我用ptr1这个指针取得array1后面几个元素,比如取得array1中的第三个元素,如果按照之前的做法,即用数组名来写的话:
movesi,offsetarray1+8
moveax,[esi]
所以我就觉得可能用指针就也是一样的吧,然后索性就把code部分改成了:
movesi,ptr1+8
moveax,[esi]
结果在调试的时候发现执行到第二个语句的时候esi直接变成了0x00000000。很纳闷,我后来还尝试了其他方法,就想既然指针已经定了数据类型,那是不是加的那个数不用考虑字节而是直接写成这样:
movesi,ptr1+2
moveax,[esi]
我猜ptr1+2可能就是表示第三个数的地址了吧。结果更有意思。在调试的时候,第一句话还没执行时,ptr1的内容是0x12408800,执行完第一句话esi的内容就变成了0x00001240。再次调试,ptr1的内容为0x0022A390,执行完第一句话esi变成0x0000022。
无论ptr1怎么变,执行完第一句话之后,esi中的内容就好像是把ptr1的内容右移4位一样。假如我要取得第二个数,我这么写:
movesi,ptr1+1
moveax,[esi]
那么一开始ptr1的内容为0x01442300,esi之后的内容就变成了0x00014423。相当于右移了2位。
我问了老师,他也不是很清楚是怎么回事。希望有大神可以给我解释一下吗。十分感谢。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:18:47 | 显示全部楼层
ptr1是一个指针,指针值指向array1
所以你
movesi,ptr1+8
取的是ptr1的地址+8的那个地址
直接
leaesi,[array1+8]
就可以了
非要用指针的话
movesi,ptr1
moveax,[esi+8]

回复

使用道具 举报

千问 | 2021-1-27 05:18:47 | 显示全部楼层
ptr1+?是把ptr当做数组了,取相应偏移处的数据,但实际是ptr就是个指针,指向处才是数组,所以只能在第二个指令上使用+?进行偏移取某元素数据。
这个结果,只要看最后运行时的指令就能看出来的。
回复

使用道具 举报

千问 | 2021-1-27 05:18:47 | 显示全部楼层
引用1楼早打大打打核战争的回复:ptr1是一个指针,指针值指向array1
所以你
movesi,ptr1+8
取的是ptr1的地址+8的那个地址
直接
leaesi,[array1+8]
就可以了
非要用指针的话
movesi,ptr1
moveax,[esi+8]
非常感谢你的回复!我们老师也是和我说,非要用指针就在第二句话那里用。
但是我还是想问一下,指针加上一个数为什么得到的结果却好像是发生了右移?一般有这种操作吗?
主要纠结在指针加上一个数结果为什么会是那样这个问题上。
回复

使用道具 举报

千问 | 2021-1-27 05:18:47 | 显示全部楼层
引用2楼zara的回复:ptr1+?是把ptr当做数组了,取相应偏移处的数据,但实际是ptr就是个指针,指向处才是数组,所以只能在第二个指令上使用+?进行偏移取某元素数据。
这个结果,只要看最后运行时的指令就能看出来的。
非常感谢你的回复。
那指针加上一个数的话,它的意义是什么呢?是使它原有的内容位移么?我不太清楚这种做法是否有一个确定的意义。
回复

使用道具 举报

千问 | 2021-1-27 05:18:47 | 显示全部楼层
一开始ptr1的内容为0x01442300,esi之后的内容就变成了0x00014423
============================================
从ptr1开始的数据00234401xxxx...
movesi,ptr1+1,esi就指向了23开始的地址,之后那个xx不属于ptr1了,只是恰好为0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行