Печать итераций цикла в сборке - PullRequest
0 голосов
/ 22 января 2019

Я только начинаю со сборки, у меня есть некоторые базовые вещи, такие как put и strlen, но некоторые концепции не имеют смысла.

Я пытаюсь реализовать базовый цикл и выводить счетчик на каждой итерации. Вот мой код:

%include 'functions.asm' ;contains print and exit


section .data
    msg db 'loop', 0x0a, 0x00

section .bss

section .text
    global _start

_start:
    mov ecx, 0

repeat:
    cmp ecx, 10
    jz done
    push ecx         ;line 18
    mov ecx, msg     ;line 19
    call print
    pop ecx          ;line 21
    inc ecx
    jmp repeat

done:
    call exit

Это работает. Но на выходе получается «цикл \ n» n раз. Я пытаюсь получить '0 \ n1 \ n2 \ n3 \ n .... n \ n'.

Пока это то, что я пытался: - удалите строки 18, 19 и 21. Сегфо, не знаю почему. - заменить строку 19 с добавлением ecx, '0'. Сегфо, а также.

Кроме того, я не уверен, почему cmp работает. Должен ли я сравнивать значение в регистре с байтом cmp [ecx], 10 вместо самого регистра? То же самое с inc, это увеличивает значение, содержащееся в ecx? Так что, если я сделаю inc [ecx], 1, это увеличит значение по адресу, содержащемуся в ecx? Так что xor ecx, ecx, inc [ecx], 1 должны увеличить значение по адресу памяти 0x00000000 на 1?

1 Ответ

0 голосов
/ 22 января 2019

Очевидно, у вас есть какая-то пользовательская функция print, которая печатает строку, на которую указывает ecx. У вас может быть print_int или аналогичная функция, которую вы можете использовать напрямую. Если нет, то вы были на правильном пути, добавив '0', однако вам нужно поместить вашу строку в память и передать на нее указатель. Одно из возможных решений:

%include 'functions.asm' ;contains print and exit

section .data
    msg db '#', 0x0a, 0x00  ; the # is a placeholder for the digit

section .text
    global _start

_start:
    mov ecx, 0

repeat:
    cmp ecx, 10
    je done
    push ecx
    add cl, '0'
    mov [msg], cl
    mov ecx, msg
    call print
    pop ecx          ;line 21
    inc ecx
    jmp repeat

done:
    call exit

Возможно, более простая версия, использующая текст для подсчета:

%include 'functions.asm' ;contains print and exit

section .data
    msg db '0', 0x0a, 0x00

section .text
    global _start

_start:
    mov ecx, msg
repeat:
    call print
    inc byte [msg]
    cmp byte [msg], '9'
    jbe repeat

done:
    call exit

Что касается вашего другого вопроса, то да, [] означает ссылку на память, поэтому не используйте ее, если хотите работать с регистром напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...