Неверный номер в AH при вводе номера в AX - PullRequest
0 голосов
/ 29 декабря 2018

Итак, я пишу программу, которая вставляет 10 чисел в массив, как показано ниже: 2, 4, 8, 14, 22 ... где число равно индексу * 2 плюс значение числа напредыдущий индекс для примера 22 находится на позиции 4;4 * 2 = 8;8 + 14 = 22;

Затем пользователь вводит двузначное число, и в переменную A программа помещает значение числа в индекс, равный введенному числу в массиве:

.model small
.data

    niza dw 10 dup(?)
    broj db ?
    A dw ?

.code

start:

    mov ax, data
    mov es, ax
    mov ds, ax

    mov bx, 0
    mov niza[bx], 2d

Insert:
    mov cx, niza[bx]
    inc bx
    push bx
    mov ax, bx
    mov bx, 2
    mov dx, 0
    mul bx
    add ax, cx
    pop bx
    mov niza[bx], ax
    cmp bx, 10
    jne Insert

    mov ah, 1
    int 21h
    sub al, 48d
    mov bl, 10
    mov dl, 0
    mul bl
    mov broj, al

    mov ah, 1
    int 21h
    sub al, 48
    add broj, al

    mov bl, broj
    mov bh, 0
    mov ah, 0
    mov al, 0
    mov ax, niza[bx]
    mov A, ax


end start

ends

Однако здесь есть проблема.

Числа правильно помещаются в массив, однако, если я поставлю число, например, 03 вместо размещения 14, то это число 14, это место число 5646.

После осмотра я обнаружил, что после перемещения значения niza [BX] в AX в инструкции:

mov ax, niza[bx]

значение в AX равно 14 в AL и 22 в AHи, таким образом, вычисляет общее значение 5646 и помещает в переменную.

14 в AL является правильным, но я понятия не имею, откуда взято 22 в AH.

Я не могу просто установить AH равным 0, потому что если я выберу из массива число с большим индексом, это даст мне большее значение, большее, чем 255, для которого нужны и AL, и AH, поэтому установите для AH значение0 после перемещения числа в топор изменит номер.

Есть идеи?

1 Ответ

0 голосов
/ 30 декабря 2018

Хорошей новостью является то, что, если бы ваш массив niza был определен как содержащий байтов , ваша программа была бы правильной.К сожалению, вы определили массив, который будет содержать слов , написав:

niza dw 10 dup(?)

Проблема заключается в использовании вами регистра BX.В то же время вы используете его для подсчета элементов и адресации элементов.Подсчет происходит за 1 , но адресация должна происходить за 2 (поскольку каждый элемент имеет длину 2 байта).

Здесь важно то, что в инструкциинапример, mov niza[bx], ax регистр BX не является индексом элемента, как в другом языке программирования, который вы, возможно, знаете, но это смещение в массиве.

word-value    index  displacement
  2             0      0
  4             1      2
  8             2      4
 14             3      6
 22             4      8
 32             5     10
 44             6     12
 58             7     14
 74             8     16
 92             9     18
112            10     20

Это способ созданиямассив:

    mov bx, 0          ; Displacement of first element  
    mov niza[bx], 2
Insert:
    mov ax, niza[bx]
    add bx, 2          ; Displacement of next element
    add ax, bx
    mov niza[bx], ax
    cmp bx, 20
    jne Insert

Поскольку в данном конкретном случае смещение уже удваивает индекс, вам не нужно умножать время на 2 *.

Аналогично вам нужно изменить получение результата:

    mov bl, broj       ; BROJ is an index
    mov bh, 0
    shl bx, 1          ; but you need a displacement, so double it
    mov ax, niza[bx]
    mov A, ax
...