8086标志位有哪些?

8086cpu的状态标志位寄存器FLAGS是一个16位寄存器,定义了9个标志位。

状态标志位

  1. 进位标志CF
  2. 奇偶标志PF
  3. 辅助进位标志AF
  4. 零标志OF
  5. 符号标志AF
  6. 溢出标志OF

控制标志位

  1. 方向标志DF
  2. 中断允许标志IF
  3. 跟踪标志TF

汇编如何判断运算结果为0?

在汇编中可以使用状态标志位的零标志(ZF)判断

  • 当 ZF 等于1,则运算结果为0
  • 当 ZF 为0,则运算结果不为0

通常在实际汇编程序中,会配合test和je指令使用

例如,test ax, ax是测试ax是否为0,它执行的是and运算但并不保存结果,则test ax, ax当且仅当ax为0条件成立,它会影响零标志位ZF

je指令会查看标志位ZF,若ZF=1则执行跳转,否则不跳转。例如 je stop_loop,当ZF=1跳转到标号stop_loop处。

用汇编实现闪烁显示字符串?

编辑代码如下:

data segment
	show_start db 'hello, world'
	show_end db '$'
data ends

code segment
	assume cs:code, ds:data
start:
	mov ax,data
	mov ds,ax
	mov dx,offset show_start    ;指定字符串段内偏移
	mov bl,11001111b  ; 指定闪烁颜色
	mov cx,offset show_end   ; 控制显示长度, 由于起始为0直接使用偏移
	
	mov ah,9
	int 10h
	int 21h
	
	mov ax,4c00h
	int 21h
	

code ends

end start

一些解释:

  • 使用bl存放要显示的颜色,以8位二进制指定
  • int 10调用bios对显示器提供的功能完成

data segment TA1 DW 0102H, 0304H, 0506H TA2 DB 02H, 03H, 04H MOV BX, DS: [0006H] AND BX, 0FFH OR BH, [BX]上述指令序列运行后,BX的内容是( )。

编写上述代码的调试汇编程序

data segment    
TA1 DW 0102H, 0304H, 0506H    
TA2 DB 02H, 03H, 04H 
data ends

code segment
	assume cs:code, ds:data
start:    

mov ax, data
mov ds, ax
MOV BX, DS: [0006H]     
AND BX, 0FFH     
AND BH, [BX]

code ends
end start

编译后,使用debug调试,观察结果

  • MOV BX, DS: [0006H] ==》BX的值为 0302
  • AND BX, 0FFH ==》 0002
  • AND BH, [BX] ==》 0002

本题的BX最终结果是:0002

如果把最后的AND改为OR,则BX结果是0402