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相互交换了它们的值。我真的对此不知所措,希望得到一些帮助,谢谢!
的元素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)