如何为python中的字节保留内存,并在nasmx64汇编中逐个读取它们?

如何为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

对我来说,这是一个非常困难的问题。我无法正确读取从python发送到nasmx64的字节。我的代码使用整数、浮点和其他简单的python对象,但不使用字节。我正在用C语言正确地转换它们,但我不能一个接一个地阅读它们。 以下是我的汇编代码的一部分:

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]
或其他)哇,你帮了我很多,再次感谢你