gpt4 book ai didi

linux - 在 nasm 宏中创建缓冲区?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:53 26 4
gpt4 key购买 nike

你可能猜到了,我是新手(nasm 和 assembly,虽然我之前做过一些基本的组装)。
我正在尝试创建一个将整数打印到标准输出的函数。使用不可重复使用的代码(其中要打印的数字是静态的),我成功了......但是,出于明显的原因,我希望它以要打印的数字作为参数。

我不确定是宏还是函数最适合我,而且我根本找不到关于 NASM 宏主题的太多信息。我已经非常仔细地阅读了手册,但这还不够。

无论如何,我已经尝试使用 NASM 宏来执行此操作,因为我创建了另一个以这种方式成功打印字符串的宏。
我已将有问题的代码缩小为:

%macro crash 1
jmp %%endstr
%%str: db %1,0x0a
%%endstr:
mov [%%str], byte 0x16 <<< this crashes (segmentation fault)
%endmacro

section .text
global _start
_start:
crash "abc"

看起来任何在缓冲区上使用括号的东西都会崩溃,我只能假设我做错了。
想要上面做的是用另一个字节值覆盖 %%str 中的第一个字节。更准确地说,我需要将一个字符串逐字节向后写入缓冲区;我(尝试)用一个循环来做这件事,我在那里做

mov [%%str+rcx], dl
dec rcx

直到 rcx 为 0。

如果我不应该为此使用宏,请赐教!
我打算将该函数保存在一个迷你库中供以后使用,因此将它弹出到任何 NASM 项目中应该很容易。

正如主题和标签所说,这一切都在 Linux/amd64 下。

最佳答案

您不能在代码段中这样做,因为它是只读的。您应该在@data 段中声明str,这样就可以了。而且,就像 @user786653 所说的那样,“你应该把它变成一个函数,让宏在你的代码周围传播内部状态是一种糟糕的风格(即使对于汇编程序也是如此!)”。

关于linux - 在 nasm 宏中创建缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6944841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com