Arrays 将数字放入AX时,AH中的数字错误
所以我在写一个程序,在数组中插入10个数字,如下所示:2,4,8,14,22。。。其中,数字等于索引*2加上先前索引上的数字的值,例如22位于位置4;4*2=8; 8+14=22; 然后用户输入一个两位数的数字,在变量a中,程序将该数字的值放在索引上,该索引等于数组中输入的数字:Arrays 将数字放入AX时,AH中的数字错误,arrays,assembly,x86-16,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 e
.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
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
然而,问题就在这里
数字正确地放入数组中,但是如果我放入一个数字,例如03,而不是14,它将放置数字14,它将放置数字5646
环顾四周后,我发现在我移动指令中AX中niza[BX]的值后:
mov ax, niza[bx]
AX中的值为14英寸AL和22英寸AH,因此计算总值5646并放入变量中
AL中的14是正确的,但我不知道AH中的22来自哪里
我不能简单地将AH设置为0,因为如果我选择从数组中获取一个较大索引上的数字,它将给我一个大于255的较大值,需要AL和AH,因此在将数字移动到ax后将AH设置为0将更改该数字
有什么想法吗 好消息是,如果niza数组被定义为包含字节,那么程序将是正确的。遗憾的是,您已将数组定义为包含单词,并编写了: 问题在于您使用了
BX
寄存器。同时,您可以使用它来计算元素的数量和寻址元素。计数每1次进行,但寻址必须每2次进行(因为每个元素的长度为2字节)
这里重要的是,在诸如mov niza[bx]之类的指令中,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
以下是创建阵列的方法:
.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
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
ax*=2
使用add ax,ax
或shl ax,1
更容易完成。切勿将mul
用于2的幂,除非您希望在DX中得到高半的结果。您的代码过于复杂,并且存在Sep指出的错误。您也不需要从内存中重新加载旧值;只需将其保存在寄存器中,因为它与上次迭代存储的内容相同。