以如下彙編函數爲例:
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是相同的作用。