Создание буфера в макросе насм? - PullRequest
1 голос
/ 04 августа 2011

Как вы можете догадаться, я новичок в этом (как нос, так и сборка, хотя я уже делал некоторые базовые сборки).
Я пытаюсь создать функцию, которая печатает целые числа в стандартный вывод. Используя одноразовый код (где число для печати является статическим), я добился успеха ... Однако по понятным причинам я хочу, чтобы в качестве аргумента он использовал число для печати.

Я не уверен, что мне лучше всего подходит макрос или функция, и я не могу найти много на тему макросов 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 ]

4 голосов
/ 05 августа 2011

Вы не можете сделать это в сегменте кода, потому что он доступен только для чтения. Вы должны объявить str в сегменте @data, тогда все будет в порядке. И так же, как @ user786653 сказал: «Вы должны сделать это функцией, так как макросы распространяют внутреннее состояние по всему коду - это плохой стиль (даже для ассемблера!)».

0 голосов
/ 18 марта 2013

для в разделе .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
...