有人可以向我解释这个 emu8086 代码吗?
Can someone explain to me this emu8086 code?
mov bx,offset array
dec bx
mov cx,100
next: inc bx
cmp [bx],0FFH
loope next
你能解释一下为什么我们 (DEC BX) 和 AGAIN (INC BX) 吗?寻找完整的答案thx
我们在循环之前递减bx ,然后循环中的第一条指令递增bx。
这样,在循环的第一次迭代中,bx 再次指向 array
的开头。在第二次迭代中,它指向第二个项目,依此类推。
最初看起来做这样的事情更直接:
mov bx, offset array
next: cmp [bx], 0ffh
inc bx
loopne next
这个问题是我们依赖 cmp
来设置 Z 标志,loopne
指令使用它——但 inc
指令也影响 Z 标志,因此这会丢失 cmp
的结果,因此 loopne
将无法再正常工作。
话虽如此,这似乎与 repne scasb
可以做的大致相同:
mov di, offset array
mov al, 0ffh
mov cx, 100
repne scasb ; this instruction implements the entire loop
最大的不同是 repne scasb
总是在一个基数在 es:di
中给出的数组中搜索,这有时处理起来很笨拙(例如,如果您已经在使用 es
指向其他东西)。
mov bx,offset array
dec bx
mov cx,100
next: inc bx
cmp [bx],0FFH
loope next
你能解释一下为什么我们 (DEC BX) 和 AGAIN (INC BX) 吗?寻找完整的答案thx
我们在循环之前递减bx ,然后循环中的第一条指令递增bx。
这样,在循环的第一次迭代中,bx 再次指向 array
的开头。在第二次迭代中,它指向第二个项目,依此类推。
最初看起来做这样的事情更直接:
mov bx, offset array
next: cmp [bx], 0ffh
inc bx
loopne next
这个问题是我们依赖 cmp
来设置 Z 标志,loopne
指令使用它——但 inc
指令也影响 Z 标志,因此这会丢失 cmp
的结果,因此 loopne
将无法再正常工作。
话虽如此,这似乎与 repne scasb
可以做的大致相同:
mov di, offset array
mov al, 0ffh
mov cx, 100
repne scasb ; this instruction implements the entire loop
最大的不同是 repne scasb
总是在一个基数在 es:di
中给出的数组中搜索,这有时处理起来很笨拙(例如,如果您已经在使用 es
指向其他东西)。