如何为python中的字节保留内存,并在nasmx64汇编中逐个读取它们?
对我来说,这是一个非常困难的问题。我无法正确读取从python发送到nasmx64的字节。我的代码使用整数、浮点和其他简单的python对象,但不使用字节。我正在用C语言正确地转换它们,但我不能一个接一个地阅读它们。 以下是我的汇编代码的一部分:如何为python中的字节保留内存,并在nasmx64汇编中逐个读取它们?,python,c,linux,assembly,nasm,Python,C,Linux,Assembly,Nasm,对我来说,这是一个非常困难的问题。我无法正确读取从python发送到nasmx64的字节。我的代码使用整数、浮点和其他简单的python对象,但不使用字节。我正在用C语言正确地转换它们,但我不能一个接一个地阅读它们。 以下是我的汇编代码的一部分: SECTION .bss integer: resb 4 string: resb 8 bytes: resq 1 SECTION .rodata l
SECTION .bss
integer: resb 4
string: resb 8
bytes: resq 1
SECTION .rodata
l_module_name db "asm", 0
parameter_list db "S"
printf_format: db "%i",10,0
SECTION .text
asm_bytes:
push rbp
push rsi
mov rbp, rsp
mov rax, 1
mov rdi, 1
mov rsi, [rsi]
mov rdx, 1
syscall
pop rsi
mov rdi, rsi
mov rsi, parameter_list
mov rdx, bytes
call PyArg_ParseTuple WRT ..plt ;;Here is conversion to C bytes
;;mov rax, 1
;;mov rdi, 1
;;mov rsi, [rdx]
;;add rsi, 48
;;mov rdx, 1
;;syscall
mov rdi, printf_format
mov rsi, [bytes]
xor rax, rax
call printf WRT ..plt ;; Here is a try to print value of bytes[0]
;;mov rdi, printf_format
;;mov rsi, [integer]
;;xor rax, rax
;;call printf WRT ..plt
;;mov rdi, printf_format
;;mov rsi, rdx
;;xor rax, rax
;;call printf WRT ..plt
mov rax, Py_None
inc QWORD [rax + PyObject.ob_refcnt]
pop rbp
ret
编译此函数并使其对python可见后,我可以在python中使用此函数,下面是python终端代码的片段:
Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> string = "takie tam"
>>> arr = bytes(string, "utf-8")
>>> import asm
>>> asm.bytes(arr)
-1995689024
>>> arr[0]
116
正如你所看到的,我从这个字节中得到了一些抽象值,我也知道它们被正确地转换了,因为在使用这个方法时,我在python中没有得到任何异常。我不知道这些字节存储在哪里,以便正确读取它们。
我还阅读了PythonC扩展的全部文档,但有人写道,转换后的值应该存储在“bytes”变量中。
请帮帮我,因为我失去了做这件事的希望。
是的,正如我前面所写的,这只是我汇编代码的一部分,其余部分纯粹是关于python与c和汇编的集成。尝试在
movrsi[bytes]
之后添加movzx esi,BYTE[rsi]
。在字节中的结果是一个指针,看起来你在打印一个(被截断的)指针?哇,你真是个上帝,它真的工作了!!!!非常感谢,如果我想阅读下一个字节,我应该增加字节?是的,或者最好在movzx…
之前增加rsi
,这样您就不会丢失原始指针(我不知道python如何处理GC和这些缓冲区的所有权,如果您在缓冲区上迭代,您可能仍然需要bytes
)。或者,使用索引寄存器(例如:movzx-esi,BYTE[rsi+rbx]
或其他)哇,你帮了我很多,再次感谢你