Конкатенация строк и переменных в x86 - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь объединить строку и переменную и сохранить ее в новую переменную в x86. Я использую Nasm для написания ассемблерного кода. Я хочу сделать что-то вроде этого:

a = 1;
b = 2;
c = "values are: " + a + " and " + b ;
print c;

Но я не знаю, как я могу объединить и присвоить значение новой переменной

1 Ответ

3 голосов
/ 09 марта 2019
a = 1;
b = 2;
c = "values are: " + a + " and " + b ;

Эти данные примерно переводятся в:

a db 1
b db 2
c db "values are: ? and ?$"

Ваши переменные a и b являются числами.Вам необходимо преобразовать их в текст, прежде чем вставлять их в строку, которая в этом упрощенном примере использует символ вопросительного знака (? ) в качестве заполнителя из одного символа.

mov al, [a]       ;AL becomes 1
add al, '0'       ;AL becomes "1"
mov [c + 12], al  ;12 is offset of the first '?'
mov al, [b]       ;AL becomes 2
add al, '0'       ;AL becomes "2"
mov [c + 18], al  ;18 is offset of the second '?'
mov dx, c         ;Address of the string
mov ah, 09h
int 21h           ;Print with DOS

Это альтернатива приведенному выше коду.Это на несколько инструкций короче, но имеет недостаток, заключающийся в том, что его нельзя использовать повторно!(Поскольку add зависит от заполнителей, оставшихся нулем)

a db 1
b db 2
c db "values are: 0 and 0$"


mov al, [a]       ;AL becomes 1
add [c + 12], al  ;12 is offset of the first '0'
mov al, [b]       ;AL becomes 2
add [c + 18], al  ;18 is offset of the second '0'
mov dx, c         ;Address of the string
mov ah, 09h
int 21h           ;Print with DOS
...