Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在nasm宏中创建缓冲区?_Linux_Assembly_X86 64_Nasm - Fatal编程技术网

Linux 在nasm宏中创建缓冲区?

Linux 在nasm宏中创建缓冲区?,linux,assembly,x86-64,nasm,Linux,Assembly,X86 64,Nasm,正如您可能猜到的,我对这方面还不熟悉(nasm和assembly,尽管我以前做过一些基本的汇编)。 我试图创建一个函数,将整数打印到标准输出。使用不可重用的代码(要打印的数字是静态的),我成功了。。。但是,出于明显的原因,我希望它将要打印的数字作为参数 我不确定是宏还是函数最适合我,我也找不到多少关于NASM宏的话题。我已经很仔细地阅读了手册,但还不够 无论如何,我已经尝试使用NASM宏来实现这一点,因为我创建了另一个以这种方式成功打印字符串的宏。 我已将有问题的代码缩小为: %macro cr

正如您可能猜到的,我对这方面还不熟悉(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"
直到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:代码不写入字符串。在代码段中可以有只读数据,但不能(不应该)在那里写。