Я только начинаю со сборки, у меня есть некоторые базовые вещи, такие как 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?