低位寄存器和高位寄存器交换位置了吗?

Did the low register and high register swap places?

IDEAL
MODEL small
STACK 100h
jumps
p186
DATASEG

array dw 312, 340, 311, 300

CODESEG
proc example
    pusha
    mov al ,4 ;number of elements in array
    mov bl, 0 ;index
    label1:
    mov cx, [array + bx] ;here, every second element ch and cl are swapped
    inc bl
    cmp bl, al
    jb label1
    popa
    ret
endp example

start:
    mov ax, @data
    mov ds, ax
    
    call example
exit:
    mov ax, 4c00h
    int 21h
END start

在我的汇编代码中,cx 在第 1 次和第 3 次迭代中没问题,但在第 2 次和第 4 次迭代中由于某种原因 clch 相互交换了它们的值.我真的不知所措,希望能得到一些帮助,谢谢!

array 的元素是单词,每个单词 2 个字节,但是在循环的每次迭代中,您只将索引 bx 递增 1。 x86 上的地址以字节为单位,因此在下一次循环迭代中,您从字的中间加载,最后一个字节来自一个元素,另一个字节来自另一个元素。

用字节而不是元素来做所有事情可能是最简单的。 (在 32 位或 64 位代码中,您可以使用缩放寻址模式 mov cx, [array+ebx*2],然后在元素中继续计数 ebx,但这在 16 位实模式中不可用。)

此外,bx 的高半部分未初始化。最好只为索引使用 16 位值。

我会重写为(未经测试):

CODESEG
proc example
    pusha
    mov ax, 4*2 ;number of bytes in array
    mov bx, 0 ;index
label1:
    mov cx, [array + bx]
    ; presumably do something with cx here
    add bx, 2
    cmp bx, ax
    jb label1
    popa
    ret
endp example