将数字放入 AX 时 AH 中的数字错误

Wrong number in AH when putting a number in AX

所以我正在编写一个程序,在数组中插入 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。

环顾四周发现,我在指令中移动了AX中niza[BX]的值后:

mov ax, niza[bx]

AX里面的值在AL里是14,在AH里是22所以计算出总值5646放在变量里。

AL中的14是正确的,但我不知道AH中的22是从哪里来的。

我不能简单地将 AH 设置为 0,因为如果我选择从数组中获取一个更大索引上的数字,它将给我一个大于 255 的更大值,它需要同时需要 AL 和 AH,因此将 AH 设置为 0将数字移动到 ax 后将改变数字。

有什么想法吗?

好消息是,如果您的 niza 数组被定义为包含 bytes,您的程序将是正确的。遗憾的是,您已将数组定义为包含 words having written:

niza dw 10 dup(?)

问题出在你对BX寄存器的使用上。同时,您使用它来计算元素并寻址元素。计数发生 per 1,但寻址必须发生 per 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