以如下汇编函数为例:
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是相同的作用。