在nasm宏中创建缓冲区?

时间:2011-08-04 16:12:25

标签: linux assembly x86-64 nasm

正如你可能猜到的那样,我是新手(无论是鼻子还是装配,虽然我之前做过一些基本装配)。 我正在尝试创建一个将整数打印到标准输出的函数。使用不可重用的代码(要打印的数字是静态的),我已经成功了...但是,出于显而易见的原因,我希望它将数字作为参数打印。

我不确定宏或函数对我来说是否最好,而且我根本找不到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下。

2 个答案:

答案 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