低音域和高域是否交换了位置?

Yar*_*inB 1 arrays x86 assembly loops cpu-registers

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
Run Code Online (Sandbox Code Playgroud)

在我的汇编代码中,cx在第一次和第三次迭代中没问题,但在第二次和第四次迭代中由于某种原因cl并ch相互交换了它们的值。我真的对此不知所措,希望得到一些帮助,谢谢!

Nat*_*dge 5

的元素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
Run Code Online (Sandbox Code Playgroud)