我有以下装配代码的玩具示例,说明了jnz
的用法。我的问题是:在下面的代码中,jnz检查是什么决定它是否是0
?我运行代码,在我看来它检查cx
寄存器。从这一点来说我不确定。例如,如果我有cmp
和cx
,那么jnz
会检查什么? cx
或cmp
结果?
mov cx, 5
mov ax, 0
mov bx, 200
add ax, bx
inc bx
dec cx
jnz 0109
int 3
答案 0 :(得分:4)
它检查状态(FLAGS)寄存器中的零标志。 要查看哪些说明修改此标记,请参阅x86 software developers manual。
它说的是DEC:
受影响的旗帜
CF标志不受影响。设置OF,SF,ZF,AF和PF标志 根据结果。
因此,JNZ检查前一条指令所设置的标志是否会发生修改,在你的情况下它是dec。
答案 1 :(得分:1)
DEC
instruction修改了标志字,因此条件跳转对DEC
的结果起作用,恰好写入cx
。
CMP
指令在技术上与SUB
相同,唯一的区别是结果未存储但只修改了标志。
答案 2 :(得分:0)
JNZ操作码检查零标志的状态。因此,在DEC cx和CMP之间,写入的内容将对该标志产生影响。因此,之后写的一个将决定JNZ的操作。