Сборка: ввод значения от пользователя (более одного ввода)

Это функция в сборке для получения ввода от пользователя в 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-й цикл проверяет его после сохранения в памяти и, таким образом, к строке прикрепляется возврат каретки.

Эта разница, вероятно, не то, что вы ожидаете.

Другие вопросы по тегам