Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将数字放入AX时,AH中的数字错误_Arrays_Assembly_X86 16 - Fatal编程技术网

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

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

所以我在写一个程序,在数组中插入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
    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指出的错误。您也不需要从内存中重新加载旧值;只需将其保存在寄存器中,因为它与上次迭代存储的内容相同。