Linux 在nasm宏中创建缓冲区?
正如您可能猜到的,我对这方面还不熟悉(nasm和assembly,尽管我以前做过一些基本的汇编)。Linux 在nasm宏中创建缓冲区?,linux,assembly,x86-64,nasm,Linux,Assembly,X86 64,Nasm,正如您可能猜到的,我对这方面还不熟悉(nasm和assembly,尽管我以前做过一些基本的汇编)。 我试图创建一个函数,将整数打印到标准输出。使用不可重用的代码(要打印的数字是静态的),我成功了。。。但是,出于明显的原因,我希望它将要打印的数字作为参数 我不确定是宏还是函数最适合我,我也找不到多少关于NASM宏的话题。我已经很仔细地阅读了手册,但还不够 无论如何,我已经尝试使用NASM宏来实现这一点,因为我创建了另一个以这种方式成功打印字符串的宏。 我已将有问题的代码缩小为: %macro cr
我试图创建一个函数,将整数打印到标准输出。使用不可重用的代码(要打印的数字是静态的),我成功了。。。但是,出于明显的原因,我希望它将要打印的数字作为参数 我不确定是宏还是函数最适合我,我也找不到多少关于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"
直到rcx为0
如果我不应该使用宏,请启发我我打算将该函数保存在一个迷你库中,以备以后使用,这样就可以很容易地将其放入任何NASM项目中
正如主题和标签所说,所有这些都是在Linux/amd64下进行的。您不能在代码段中这样做,因为它是只读的。您应该在@data段中声明str,然后就可以了。而且,正如@user786653所说,“你应该把它变成一个函数,让宏在你的代码中散布内部状态是一种糟糕的风格(即使对于汇编程序也是如此!)”你不能在代码段中这样做,因为它是只读的。您应该在@data段中声明str,然后就可以了。而且,正如@user786653所说,“你应该让它成为一个函数,让宏将内部状态散布在你的代码周围是一种糟糕的风格(即使对于汇编程序也是如此!)”对于一个节中的数据 );使用名称和字节数
%macro BUFFER 2
%1:
.start: times %2 db 0
.end:
.length: equ %1.end-%1.start
%endmacro
%macro BUFFER 2
%1:
.start: resb %2
.end:
.length: equ %1.end-%1.start
%endmacro
对于第.bss节中的
);使用名称和字节数
%macro BUFFER 2
%1:
.start: times %2 db 0
.end:
.length: equ %1.end-%1.start
%endmacro
%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
b.bss部分的idem
%macro BUFFER 2
%1:
.start: resb %2-1
.end: resb 1
.length: equ %1.end-%1.start
%endmacro
对于节中的。数据
);使用名称和字节数
%macro BUFFER 2
%1:
.start: times %2 db 0
.end:
.length: equ %1.end-%1.start
%endmacro
%macro BUFFER 2
%1:
.start: resb %2
.end:
.length: equ %1.end-%1.start
%endmacro
对于第.bss节中的
);使用名称和字节数
%macro BUFFER 2
%1:
.start: times %2 db 0
.end:
.length: equ %1.end-%1.start
%endmacro
%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
b.bss部分的idem
%macro BUFFER 2
%1:
.start: resb %2-1
.end: resb 1
.length: equ %1.end-%1.start
%endmacro
您应该将其作为一个函数,让宏将内部状态散布在代码周围是一种糟糕的风格(即使对于汇编程序也是如此!)。它还将帮助您进行调试。如果您想在手头的问题上获得更多帮助,您应该发布所有相关代码和gdb的输出(
gdb./program
,并捕获bt
和info reg
)的输出。您应该将此作为一个函数,让宏在代码周围传播内部状态是一种糟糕的风格(即使对于汇编程序也是如此!)。它还将帮助您进行调试。如果您想在手头的问题上获得更多帮助,您应该发布所有相关代码和gdb的输出(gdb/您的程序
,并捕获bt
和info reg
)的输出。该死,我怎么会忽略代码“段”对数据的隐含用法?过多地看那些无关紧要的旧汇编代码,我想:)+1,因为这几乎肯定是正确的答案。谢谢,既然你这么说了,我记得了。我应该再复习一下基础知识。无论如何,这有点令人困惑:以同样的方式存储数据!我认为这只是侥幸,而不是我应该考虑的工作代码,然后?@ ExcSpAp:代码不写入字符串。你可以在代码段中有只读数据,但你不能(不应该)在那里写。该死,我怎么会忽略代码“段”对数据的隐含用法呢?过多地看那些无关紧要的旧汇编代码,我想:)+1,因为这几乎肯定是正确的答案。谢谢,既然你这么说了,我记得了。我应该再复习一下基础知识。无论如何,这有点令人困惑:以同样的方式存储数据!我认为这只是侥幸,而不是我应该考虑的工作代码,然后?@ ExcSpAp:代码不写入字符串。在代码段中可以有只读数据,但不能(不应该)在那里写。