低位寄存器和高位寄存器交换位置了吗?
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 次迭代中由于某种原因 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
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 次迭代中由于某种原因 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