Сборка: ввод значения от пользователя (более одного ввода)
Это функция в сборке для получения ввода от пользователя в 2 строки "размер" и "в",
но это займет всего 1 вход, а затем начинает падать.
Мне нужна помощь. Заранее спасибо.
input:
mov si,0
lb :
mov ah,0
int 16h
cmp al,0x0d
je 2nd
mov [size + si],al
inc si
loop lb
2nd:
mov si,0
lb1:
mov ah,0
int 16h
mov [per + si],al
cmp al,0x0d
je 3rd
inc si
loop lb1
3rd:
ret
1 ответ
Решение
Для создания цикла не обязательно использовать loop
инструкция!
В вашем 1-м цикле, после сохранения размера символа и после увеличения указателя в SI
, вам нужно всегда возвращаться к началу цикла. Правильная инструкция тогда есть jmp lb
, безусловный переход к метке lb.
input:
mov si, 0
lb :
mov ah, 0
int 16h
cmp al, 0x0d
je 2nd
mov [size + si], al
inc si
jmp lb ; The unconditional jump
2nd:
Во втором цикле, после увеличения указателя в SI
, вам нужно всегда возвращаться к вершине этого цикла. Правильная инструкция тогда есть jmp lb1
, безусловный переход к метке lb1.
mov si, 0
lb1:
mov ah, 0
int 16h
mov [per + si], al
cmp al, 0x0d
je 3rd
inc si
jmp lb1 ; The unconditional jump
3rd:
ret
Одна вещь, о которой вы должны знать, это то, где вы проверяете ключ ENTER (ASCII 13):
- 1-й цикл проверяет его перед сохранением в памяти и, следовательно, к размеру строки не добавляется возврат каретки.
- 2-й цикл проверяет его после сохранения в памяти и, таким образом, к строке прикрепляется возврат каретки.
Эта разница, вероятно, не то, что вы ожидаете.