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

2024-06-23 15:31:52 发布

您现在位置:Python中文网/ 问答频道 /正文

对我来说,这是一个非常困难的问题。我无法正确读取从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中没有得到任何异常。我不知道这些字节存储在哪里,以便正确读取它们。 我还阅读了pythoncextensions的完整文档,但有人认为转换后的值应该存储在“bytes”变量中。 请帮帮我,因为我对这项工作失去了希望。 是的,正如我之前写的,这只是我汇编代码的一部分,rest纯粹是关于python与c和汇编语言的集成。你知道吗


Tags: 代码format字节bytessectionpltcallrax

热门问题