首页 > 解决方案 > CTypes NASM - 如何取消引用指向指针数组的指针

问题描述

更新:下面的代码确实可以取消引用指针。我在入口点错误地插入了一些行,这些行具有覆盖内存位置 f1_ptr 的效果。重要的部分是当指针存储在内存位置时延迟指针是:mov r15,qword[f1_ptr] / mov rdx,qword[r15+0]。将内存移动到 r15,然后将 r15 移动到 rdx。这样做。但正如 Peter Cordes 在下面解释的那样,内存位置不是线程安全的,因此最好至少将寄存器用于指针。

****更新结束****

我正在使用 ctypes 将指针传递给指针数组;每个指针都指向名称列表中字符串的开头。在 Windows ABI 中,指针作为 rcx 中的第一个参数传递。

在进入程序时,我通常将指针放入内存变量,因为我不能将它们保存在像 rcx 和 rdx 这样的低位寄存器中;在这种情况下,它被存储为 mov [f1_ptr],rcx。但是在程序的后期,当我从内存移动到注册时,它不起作用。在其他使用简单指针(不是指向指针数组的指针)的工作中,我没有问题。

基于对较早问题的回答(Python ctypes 如何从传递给 NASM 的字符数组中读取字节),我发现如果我将 rcx 存储在另一个寄存器中(例如,r15),我可以自由地使用它而无需程序下游的问题。例如,要访问第二个名称字符串的第二个字节:

xor rax,rax
mov rdx,qword[r15+8]
movsx eax,BYTE[rdx+1]
jmp label_900

相反,如果我在程序中将 mov r15,[f1_ptr] 移到下游,那是行不通的。模拟上面的代码:

xor rax,rax
mov r15,qword[f1_ptr]
mov rdx,qword[r15+8]
movsx eax,BYTE[rdx+1]
jmp label_900

但它不仅不起作用,还会崩溃。

所以问题是:rcx 在进入程序时存储在内存中。后来我把它从内存读回 r15 并以同样的方式取消引用它。为什么它的工作方式不同?

完整的代码,减去上面显示的代码段,在我上面发布的链接中。

标签: pointersnasmx86-64ctypes

解决方案


推荐阅读