python - 我如何为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 和汇编的集成。
解决方案
推荐阅读
- blockchain - 如何在 BitGo API 中获取硬币的当前区块高度?
- python - 重定向标准输出时的 Input() 缓冲区
- macos - 在 Mac 上安装 App 会导致“已损坏,无法打开。您应该将其移至 Bin。”
- sql - SQL: Getting the user's info and their latest dated record from another table
- python - 如何让机器人在 discord.py 中使用自定义表情符号
- reactjs - 数据流和数据绑定是什么关系?
- javascript - Socket.io 客户端无法正确连接
- r - 在 R Shiny 中,如何检查元素是否隐藏?
- node.js - 如何在托管中运行快递应用程序?我的网站出现 503 错误
- android - 如何将图像保存到android中的图片文件夹