题目:下面的程序执行后,ax的值是多少? assume cs:codesg datasg segment db 16 dup(0) datasg ends codesg segment start: mov ax,0 push ax popf mov ax,0fff0h add ax,0010h pushf pop ax and al,11000101b and ah,00001000b mov ax,4c00h int 21h codesg ends end start 解析: assume cs:codesg datasg segment db 16 dup(0) datasg ends codesg segment start: mov ax,0 push ax popf;把0赋值给标志寄存器,即把其所有标志位清零 mov ax,0fff0h add ax,0010h;执行此加法运算后,ax的值为0,但是产生了进位,且有0(偶数)个1。所以pf=1、zf=1、cf=1,所以标志寄存器中的值就是0045h,但是在调试时却是0047h,不明白为什么? pushf pop ax;把标志寄存器的值给ax,即ax=0045h and al,11000101b;al的值45h鱼器and后还是45h and ah,00001000b;由于ah的值为0,所以ah and之后的值就是0 mov ax,4c00h int 21h codesg ends end start 所以ax的值为0045h