2014-03-13 40 views
2

我学习汇编语言的时刻,并通过逃学尔湾书汇编语言,他谈到条件跳转指令,并给出了下面的例子怎么做与SUB操作条件跳转指令工作

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,但是如果cx = 0,jcxz会测试吗?

任何帮助将不胜感激。

回答

0

因为从比较中设置的位标志(在这种情况下,您只关心ZF)尚未被清除。

在旁注中,您应该使用CMP而不是SUB

0

“条件”基于标志,通常是进位标志,零标志,负标志和溢出标志。但并非所有的处理器架构都采用完全相同的方式,但多数使用这四个标志。

这些标志来自“alu”,指令集定义了哪些标志是否受每条指令的影响。因此,您必须查看每条指令的文档,了解哪些标志受到影响以及如何实施,然后了解是否可以帮助您。

减法或比较(差异通常是子修改结果寄存器或内存,其中cmp做的所有事情与减法相同,除非它不修改目标)非常有用,因为使用单个减法可以确定等于,大于或小于(以及小于或等于,大于或等于)的组合。

对于案例je或跳跃,如果相等。如果您从b和b中减去a,并且a是相同的值,那么结果为零,则相减将导致为零。如果结果为零,则设置z标志,否则不设置z标志。因此,如果比较结果与z标志被设置为相等的情况相同,那么如果相等则跳转,如果跳转为0,则跳转,如果结果为零则跳转,如果设置了零标志,则跳转与跳转相同。如果不设置零标志,则Jne跳转(如果不相等或跳转)(有时根据指令集和语法,您将看到jnz)。在你的情况下,你从自身减去1234结果为零,z标志被设置,jne不会影响它所说的跳转,如果z位为零或继续前进,所以它继续前进,然后je说跳转,如果z标志设置它是如此跳跃...

2

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

sub是为此目的而特别“好”,因为它会影响在完全相同的方式标志一个cmp没有(subcmp之间的唯一区别是,sub写减法到目的地的结果,而cmp才不是)。

请记住,je实际上只是jz的同义词,它并不关心任何形式的平等,它只是看着Z标志。 1234h减去本身显然是零,所以应该设置Z标志。

在第二个示例中,jcxz的分支如果是cx = 0,则是这种情况。增加cx后,它将为零,因为它之前为-1。