首页 > 解决方案 > 我如何为python中的字节保留内存并在nasmx64程序集中一一读取?

问题描述

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

标签: pythonclinuxassemblynasm

解决方案


推荐阅读