Данные копируются в 2 массива - PullRequest
2 голосов
/ 29 октября 2019

Поэтому я пытаюсь создать простую программу, которая копирует вставленные данные в массив:

.model small
.stack 100
.data
    i db 0
    j db 0
    first db 0 dup(9)
    last db 0 dup(9)

.code
    mov ax, data
    mov ds, ax
    mov es, ax
Loop1:    
    mov ah, 1
    int 21h
    mov bl, i
    mov bh, 0
    mov ah, 0

    mov first[bx], al
    add i, 1
    jmp Loop1

Однако, когда я запускаю программу и проверяю состояние переменных, данные автоматически копируютсяв массив 'last', хотя еще не было кода, который велел бы программе сделать это.

Есть идеи?

1 Ответ

1 голос
/ 31 октября 2019
first db 0 dup(9)
last db 0 dup(9)

Замечание "... данные автоматически копируются в массив 'last', даже если не было никакого кода, который велел бы программе сделать это". правильно, потому что вы фактически поместили обе метки first и last в одном месте.

При использовании оператора dup для получения нескольких копийдля некоторого значения вы должны указать число перед оператором dup и значения, которые должны повторяться в скобках.

first db 9 dup (0)
last  db 9 dup (0)

Это приводит к следующему результату, который оставляеткомната для 9 входных байтов:

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
^                          ^
first
                           last

При счете 2 вы получите:

0, 0, 0, 0
^     ^
first
      last

При счете 1 вы получите:

0, 0
^  ^
first
   last

Но с ошибочным 0 в качестве числа вы получили:

?
^
first
last

и, следовательно, запись в first[bx] также пишет в last[bx].


Вы не хотитеввода больше, чем может загрузить буфер!

Loop1:
    ...
    jmp Loop1

Ваш текущий код представляет собой бесконечный цикл.
Учитывая, что во входном буфере есть место для 9 байтов, вам нужно ограничитьколичество итераций к этому много. Используйте переменную-счетчик, такую ​​как mov cx, 9, которую вы уменьшаете с каждой итерацией, и когда она достигает 0, вы останавливаете цикл.

    mov cx, 9
Loop1:    
    mov ah, 01h
    int 21h
    mov bl, i
    mov bh, 0
    mov first[bx], al
    add i, 1
    dec cx
    jnz Loop1

Оптимизированный способ сделать это объединяет счетчик и адрес смещения в одномрегистр. У вас есть выбор между BX, SI и DI. Там также BP, но тогда вам придется возиться с сегментными регистрами. Не знаю, готовы ли вы к этому!

    xor bx, bx
Loop1:    
    mov ah, 01h
    int 21h
    mov first[bx], al
    inc bx
    cmp bx, 9
    jb  Loop1

Как видите, не было никакой реальной необходимости использовать основанную на памяти переменную индекса i .

...