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是相同的作用。

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