所以我正在编写一个程序,该程序在数组中插入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轴上的数字将更改数字。
有什么想法吗?
答案 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