pushf
的功能是將標志寄存器的值壓棧,而 popf
是從棧中彈出數據,送入標志寄存器中。
pushf
和 popf
為直接訪問標志寄存器提供了一種方法。
8086CPU 的 flag 寄存器(即標志寄存器) 的結構如下:
王爽匯編語言 檢測點 11.4 幫助理解
題目:下面的程序執行后:(ax) = ?
mov ax,0 ; (ax) = 0
push ax ; 將 (ax) 入棧
popf ; 將 flag 寄存器的所有位都初始化為 0. 因為它們使用的是同一個棧結構.
mov ax,0ff0h ; (ax) = 0ff0h
add ax,0010h ; 執行 add 后, 結果是: (ax) = 0000h(作為無符號數, 產生進位 CF = 1)
; 而作為有符號數沒有溢出, OF = 0, 其它 ZF = 1, SF = 0, PF = 1. 我們把這些
; 標志位按照順序組合起來(不能確定的用 x 表示, 沒有使用的用 0 表示) --> 00000xxx010x0101
pushf ; 將 flag 的值入棧
pop ax ; 彈棧, (ax) = 00000xxx010x0101
and al,11000101B ; ax 低八位按位與, 010x0101 and 11000101 = 01000101B = 45H
and ah,00001000B ; ax 高八位按位與, 00000xxx and 00001000 = 00000000B = 00H
答案是 (ax) = 0045h