cmp/test && je/jz分析

以如下汇编函数为例:

put_queue:
	pushl %ecx
	pushl %edx
	movl table_list,%edx		# read-queue for console
	movl head(%edx),%ecx
1:	movb %al,buf(%edx,%ecx)
	incl %ecx
	andl $size-1,%ecx
#cmp和sub指令对标志位寄存器是相同的效果,只是结果不会存储到目的操作数中。
#如果源操作数和目的操作数是相同的,则结果为0,ZF=1。
#je:Jump if equal (ZF=1)。
#所以cmp的两个数相等,跳转到3f。
#这个和正常的逻辑是一样的。
	cmpl tail(%edx),%ecx		# buffer full - discard everything
	je 3f
	shrdl $8,%ebx,%eax
	je 2f
	shrl $8,%ebx
	jmp 1b
2:	movl %ecx,head(%edx)
	movl proc_list(%edx),%ecx
#test:
#DEST : = LeftSRC AND RightSRC;
#test是逻辑与操作,影响标志位寄存器,结果直接丢弃,可以看作C语言的&&。TEST和AND指令不同的地方是TEST不改变目的操作数。
#如果源操作数&&目的操作数==0,则ZF=1,会执行je 3f指令。
#这里可以看作是判断ecx是否为0。
	testl %ecx,%ecx
	je 3f
	movl $0,(%ecx)
3:	popl %edx
	popl %ecx
	ret

JE/JZ ZF = 1 equal/zero
JE和JZ是相同的作用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章