我正在学习汇编语言,并且在kip irvine的书籍汇编语言中,他讨论了条件跳转指令并给出了以下示例
Example 2:
mov bx,1234h
sub bx,1234h
jne L5 ; jump not taken
je L1 ; jump is taken
Example 3:
mov cx,0FFFFh
inc cx
jcxz L2 ; jump is taken
有人可以向我解释一下示例2中的“je L1”是如何工作的。你不需要在某处使用cmp命令。什么特别导致你跳跃,就像那一刻bx = 0;
同样为什么跳转在例3中。我认为你正在递增cx,但是jcxz会测试cx = 0?
非常感谢任何帮助。
答案 0 :(得分:2)
不,您不需要在任何地方使用cmp
命令。许多指令会影响标志(或其中的一部分)。
sub
特别好"好"为此目的,因为它以与cmp
完全相同的方式影响标志(sub
和cmp
之间的唯一区别是sub
写入减法的结果到目的地,而cmp
没有。)
请记住,je
实际上只是jz
的同义词,它并不真正关心任何形式的相等性,它只是查看Z标志。 <{1}}减去它本身显然是零,所以应该设置Z标志。
在第二个示例中,1234h
分支jcxz
,情况就是这样。递增cx = 0
后,它将为零,因为它之前是-1。
答案 1 :(得分:0)
因为比较中设置的位标志(在这种情况下你只关心ZF
)尚未被清除。
在旁注中,您应该使用CMP
而不是SUB
。
答案 2 :(得分:0)
&#34;条件&#34;基于标志,通常是进位标志,零标志,负标志和溢出标志。但并非所有的处理器架构都以完全相同的方式完成,但大多数都使用这四个标志。
这些旗帜出自&#34; alu&#34;并且指令集定义哪个标志受每个指令影响或不受其影响。因此,您必须查看每条指令的文档,了解受影响的标志和方式,然后了解这是否对您有所帮助。
减去或比较(差异通常是sub修改结果寄存器或内存,其中cmp执行与减法相同的所有内容,除非它不修改目标)是非常有用的,因为通过单个减法可以确定等于,更大小于或小于(和小于或等于,大于或等于的组合)。
如果情况是je或跳跃,如果相等。减法将导致零或不归零,如果从b中减去a,b和a的值相同,则结果为零。如果结果为零则设置z标志,否则不设置z标志。因此,如果比较导致事物相等,则与设置的z标志相同,如果相等,则跳跃如果为零也称为跳跃,如果结果为零,则跳转,如果设置了零标志,则跳转相同。如果不相等则Jne跳跃或者如果未设置零标志则跳转(有时您将看到jnz,具体取决于指令集和语法)。在你的情况下你从它自己减去1234结果为零,z标志设置jne不影响它说如果z位为零或继续前进的标志,所以它继续前进,然后je说如果z标志跳设置它是如此跳跃......