正如你可能猜到的那样,我是新手(无论是鼻子还是装配,虽然我之前做过一些基本装配)。 我正在尝试创建一个将整数打印到标准输出的函数。使用不可重用的代码(要打印的数字是静态的),我已经成功了...但是,出于显而易见的原因,我希望它将数字作为参数打印。
我不确定宏或函数对我来说是否最好,而且我根本找不到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下。
答案 0 :(得分:4)
您不能在代码段中执行此操作,因为它是只读的。你应该在@data段声明str,那你就没事了。并且,就像@ user786653所说的那样,“你应该让它成为一个函数,让宏在你的代码周围传播内部状态是坏的风格(即使是汇编程序!)”。
答案 1 :(得分:0)
表示.data
部分使用名称和字节数
%macro BUFFER 2
%1:
.start: times %2 db 0
.end:
.length: equ %1.end-%1.start
%endmacro
表示.bss
部分使用名称和字节数
%macro BUFFER 2
%1:
.start: resb %2
.end:
.length: equ %1.end-%1.start
%endmacro
这里的问题是我们想要知道缓冲区的最后一个字节然后它是buffer.end- 1 一个可能的解决方案,但我还没有尝试过:
%macro BUFFER 2
%1:
.start: times %2-1 db 0
.end: db 0
.length: equ %1.end-%1.start
%endmacro
.bss部分的同意
%macro BUFFER 2
%1:
.start: resb %2-1
.end: resb 1
.length: equ %1.end-%1.start
%endmacro