条件跳转指令如何与SUB操作数一起使用

时间:2014-03-13 19:18:18

标签: assembly x86 masm masm32

我正在学习汇编语言,并且在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?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

不,您不需要在任何地方使用cmp命令。许多指令会影响标志(或其中的一部分)。

sub特别好"好"为此目的,因为它以与cmp完全相同的方式影响标志(subcmp之间的唯一区别是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标志跳设置它是如此跳跃......