Linux 在nasm程序集中的.data段外部声明字符串

Linux 在nasm程序集中的.data段外部声明字符串,linux,gcc,assembly,intel,nasm,Linux,Gcc,Assembly,Intel,Nasm,有没有办法在汇编代码的.text部分定义如下的字符串指针 SECTION .text global main main: fmt: dd "%s", 10, 0 或者构造字符串并用寄存器指向它,将所有这些都放在.text部分 汇编程序非常愚蠢,您必须明确地编写所有内容,如下所示: SECTION .text

有没有办法在汇编代码的
.text
部分定义如下的字符串指针

SECTION .text          

        global main             


main:                        
        fmt:    dd      "%s", 10, 0 

或者构造字符串并用寄存器指向它,将所有这些都放在
.text
部分

汇编程序非常愚蠢,您必须明确地编写所有内容,如下所示:

SECTION .text          

        global main             


main:                        
        ; Some code here, you don't want to execute data.

        mov     ebx, fmt ; ebx points to fmt[0] ('%')
        mov     eax, dword [pfmt] ; eax also points to fmt[0] ('%')

        ; Some more code here.

        pfmt    dd fmt ; pfmt is a constant pointer to fmt[0] ('%')
        fmt     db "%s", 10, 0 ; fmt is a constant string
您可以使用宏简化编码:

%macro  LoadRegWithStrAddr 2+

        jmp     %%endstr
  %%str:        db      %2
  %%endstr:
        mov     %1, %%str

%endmacro

SECTION .text          

        global main             


main:                        
        LoadRegWithStrAddr ebx, "%s", 10, 0 ; ebx points to "%s\n"
LoadRegWithStrAddr ebx,“%s”,10,0
扩展为:

        jmp     %%endstr
  %%str:        db      "%s", 10, 0
  %%endstr:
        mov     ebx, %%str

请参阅NASM文档。

汇编程序非常愚蠢,您必须明确地编写所有内容,如下所示:

SECTION .text          

        global main             


main:                        
        ; Some code here, you don't want to execute data.

        mov     ebx, fmt ; ebx points to fmt[0] ('%')
        mov     eax, dword [pfmt] ; eax also points to fmt[0] ('%')

        ; Some more code here.

        pfmt    dd fmt ; pfmt is a constant pointer to fmt[0] ('%')
        fmt     db "%s", 10, 0 ; fmt is a constant string
您可以使用宏简化编码:

%macro  LoadRegWithStrAddr 2+

        jmp     %%endstr
  %%str:        db      %2
  %%endstr:
        mov     %1, %%str

%endmacro

SECTION .text          

        global main             


main:                        
        LoadRegWithStrAddr ebx, "%s", 10, 0 ; ebx points to "%s\n"
LoadRegWithStrAddr ebx,“%s”,10,0
扩展为:

        jmp     %%endstr
  %%str:        db      "%s", 10, 0
  %%endstr:
        mov     ebx, %%str

请参阅NASM文档。

是。您可能还可以使用
.rodata
部分来获取只读数据。是的。您可能还可以使用
.rodata
部分来获取只读数据。