Объявление строк вне сегмента .data в сборке nasm - PullRequest
1 голос
/ 16 декабря 2011

Есть ли способ определить указатель строки в части .text кода ассемблера, как этот?

SECTION .text          

        global main             


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

или, может быть, построена строка и есть регистр, указывающий на нее, все это можно сделать в разделе .text?

1 Ответ

1 голос
/ 16 декабря 2011

Ассемблеры довольно глупы, и вы должны писать все явно, например:

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.

...