CTypes NASM - как разыменовать указатель на массив указателей - PullRequest
0 голосов
/ 24 января 2019

ОБНОВЛЕНИЕ: приведенный ниже код работает для разыменования указателя. Я неправильно вставил несколько строк в точку входа, что привело к переопределению места в памяти f1_ptr. Важная часть заключается в том, что для сохранения указателя, когда он хранится в ячейке памяти, есть: mov r15, qword [f1_ptr] / mov rdx, qword [r15 + 0]. Переместите память в r15, затем переместите r15 в rdx. Это делает это. Но, как объясняет Питер Кордес ниже, области памяти не являются поточно-ориентированными, поэтому лучше всего использовать регистры для указателей.

**** Конец обновления ****

Я использую 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

Если вместо этого я перемещу 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 и разыменовал это так же. Почему это не работает так же?

Полный код, за исключением сегментов кода, показанных выше, находится по ссылке, которую я разместил выше.

...