在AX中输入数字时,AH中的数字错误

时间:2018-12-29 18:26:09

标签: arrays assembly x86-16

所以我正在编写一个程序,该程序在数组中插入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中的值在AL中为14,在AH中为22,因此计算出总值5646并将其放置在变量中。

AL中的14是正确的,但我不知道AH中的22来自何处。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

好消息是,如果将您的 niza 数组定义为包含 bytes ,则您的程序将是正确的。不幸的是,您已经定义了包含以下内容的数组:单词

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