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