CTypes NASM-如何将指针取消引用到指针数组

时间:2019-01-24 18:47:44

标签: pointers nasm x86-64 ctypes

更新:下面的代码确实可以解除对指针的引用。我在入口点错误地插入了一些行,这些行影响了内存位置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 how to read a byte from a character array passed to NASM的回答),我发现如果我将rcx存储在条目的另一个寄存器中(例如r15),则可以在程序下游毫无问题地自由使用它。例如,访问第二个名字字符串的第二个字节:

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

如果相反,我在程序的下游移动了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并以相同的方式取消引用。为什么它不能以相同的方式工作?

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

0 个答案:

没有答案