博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编语言 标志位
阅读量:3961 次
发布时间:2019-05-24

本文共 4687 字,大约阅读时间需要 15 分钟。

加法和进位标志位

两个无符号整数相加时,进位标志位是目的操作数最高有效位进位的副本。如果和数超过了目的操作数的存储大小,就可以认为CF=1。

mov al, 0FFHadd al , 1                    ; AL = 00 , CF = 1

在上面的加法运算中,AL最高有效位的进位复制到进位标志位。

在这里插入图片描述

如果AX的值为00FFH,则对其进位加1操作后,和数不会超过16位,那么进位标志位清0.

mov ax, 00FFHadd ax, 1              ; AX = 0100H, CF = 0

但是,如果AX的值为FFFFH,则对其进行加1操作后,AX的高位就会产生进位

mov ax, 0FFFFHadd ax, 1          ; AX = 0000, CF = 1

减法和进位标志位

从较小的无符号整数中减去较大的无符号整数时,减法操作就会将进位标志位置1.

mov al, 1sub al, 2     ; AL = FFH , CF = 1

在这里插入图片描述

注:

  • INC和DEC指令不会影响进位标志位。在非零操作数上应用NEG指令总是会将进位标志位置1。
  • 移动指令 mov、push、pop这些指令不会影响标志位。

零标志位

当算术运算结果等于0时,零标志位置1。

例1:

mov cx, 1sub cx, 1						; ECX = 0, ZF = 1mov ax, 0FFFFFFFFHinc ax 							; ECX = 0, ZF = 1inc ax 							; ECX = 1, ZF = 0dec ax							; ECX = 0, ZF = 1

例2:

mov ax, 100and ax, 0mov ax, 4C00Hint 21

在这里插入图片描述

注:mul 和 div 运算不影响零标志位。

奇偶标志位

目的操作数最低有效字节中1的个数为偶数时,奇偶(PF)标志位置1。

mov al, 10001100Badd al, 00000010B   ; AL = 10001110,  PF = 1sub al, 10000000B	; AL = 00001110, PF = 0

在这里插入图片描述

执行了ADD指令后,AL的值为1000 1110(4个0, 4个1),PF = 1。执行了SUB指令后,AL的值包含了奇数个1,因此奇偶标志位等于0。

符号标志位

有符号数算术操作结果为负数,则符号标志位置1。

mov ax, 4sub ax, 5  ; EAX = -1 , SF =1

在这里插入图片描述

从机器的角度来看,符号标志位是目的操作数高位的副本。

mov bl ,1    ; BL = 01Hsub bl ,2    ; BL = FFH(-1),  SF = 1

注:SF把计算的结果看作是正数或负数。


例如:

下面每条指令执行后,ZF PF SF标志位的值

assume cs:codecode segmentstart:		;							ZF      PF    SF			mov ax, 0	 			sub al, al     ;1        1    0     al = 0000 0000B			mov al, 1      ;1        1    0 	al = 0000 0001B			push ax        ;1        1    0			pop bx         ;1        1    0     bl = 0000 0001B			add al, bl     ;0        0    0		al = 0000 0010B			add al, 10     ;0        1    0		al = 0000 1100B			mul al         ;0        1    0     AX = 0000 0000 1001 0000B						; mul  不影响 SF 标志位						mov ax, 4C00H			int 21					code endsend start

溢出标志位

有符号数算术操作结果与目的操作数相比,如果发生上溢或下溢,则溢出标志位置1.

mov al, +127add al, 1   ;  0F = 1

在这里插入图片描述

同样,最小的负数为-128,再减1就发生下溢。如果目的操作数不能容纳一个有效算术运算结果,那么溢出标志位置1。

mov al,  -128sub al, 1         ; OF = 1

在这里插入图片描述

assume cs:code, ds:data, ss:stackdata segment		db 256 dup(0)data endsstack segment stack		db 128 dup(0)stack endscode segment		start: mov ax, stack			   mov ss, ax			   mov sp, 128			   			   mov al, 80H   ; - 128 - 1 = -129			   sub al, 1			   			   mov ax, 4C00H			   int 21H			   code endsend start

在这里插入图片描述

assume cs:code, ds:data, ss:stackdata segment		db 256 dup(0)data endsstack segment stack		db 128 dup(0)stack endscode segment		start: mov ax, stack			   mov ss, ax			   mov sp, 128			   			   mov al, 99			   add al, 98			   			   mov ax, 4C00H			   int 21H			   code endsend start

在这里插入图片描述

注:

  • AL字节型数据表示的范围:-128~127
  • AX字型数据表示的范围:-32768~32767
  • 超过以上范围就会溢出,溢出标志位置1。

方向标志位

它用于控制字符串操作指令中地址指针变换的方向。若DF=0,串操作从低地址向高地址方向进行,每次操作后使地址指针SI、DI自动递增;若DF =1,则串操作从高地址向低地址方向进行,SI、DI自动递减。执行CLD指令可使DF清0,STD指令使DF置1。

以下代码实现的是对指令的复制,复制到段地址:偏移地址 0000H:7E00H

assume cs:code, ds:data, ss:stackdata segment		db 128 dup(0)data endsstack segment stack		db 128 dup(0)stack endscode segment		start:	mov ax, stack			mov ss, ax			mov sp, 128						call cpy_Boot			mov ax, 4C00H			int 21H;==========================================Boot:		mov ax, 1000H			mov ax, 1000H			mov ax, 1000H			mov ax, 1000HBoot_end:   nop; ===========================================cpy_Boot:			mov bx, cs			mov ds, bx			mov si, OFFSET Boot         ; ds:[si]   从 Boot 开始复制						mov bx, 0			mov es, bx			mov di, 7E00H           ; es:[di]   复制到 段地址:偏移地址 0000H:7E00H						mov cx, OFFSET Boot_end - Boot  ; 复制次数			cld							  ; DF = 0			rep movsb ; 复制屏幕上的东西     ; rep重复  movsb 复制字节               							                                  ;每执行一次都会自动执行             inc si   inc di,无需自己调用										; dec si   dec di			retCODE ENDS           ; 结束END START
  • rep movsb 复制字节
    • b相当于byte
  • rep movsw 复制字
    • w相当于word
      在这里插入图片描述

在这里插入图片描述

assume cs:code, ds:data, ss:stackdata segment		db 128 dup(0)data endsstack segment stack		db 128 dup(0)stack endscode segment		start:	mov ax, stack			mov ss, ax			mov sp, 128						call init_reg						call cpy_screen			mov ax, 4C00H			int 21H; ===========================================================cpy_screen:			mov cx, 24						mov si, 160			mov di, 0			cpyScreenRow:			push cx			push si			push di			mov cx, 80						cld			rep movsw						pop di			pop si			pop cx			add si, 160			add di, 160			loop cpyScreenRow;============================================================init_reg:					mov bx, 0B800H			mov ds, bx			mov es, bx			retCODE ENDS           ; 结束END START
标志 真值为1 假值为0
OF OV NV . OV = Overflow NV = not overflow
SF NG PL NG = negative PL = Positive
ZF ZR NZ ZR = Zero NZ = not Zero
PF PE PO PE = EVEN PO = ODD
CF CY NC CY = Carry Yes Nc = not Carry
DF DN UP Dn = Down UP

中断标志

IF = 1时,允许CPU响应可屏蔽中断,IF = 0时,禁止响应可屏蔽中断。执行STI指令可使IF置1,CLI指令使IF清0.

陷阱标志

TF也称为单步标志,它是为调试程序提供方便而设置的。若TF置1,则使CPU处于单步工作方式,每执行完一条指令,自动产生一次单步中断,将寄存器、存储器等内容显示在屏幕上,用户可查看本条指令执行后的结果,以便逐条检查指令执行结果。若TF = 0,则程序正常运行。

转载地址:http://pbqzi.baihongyu.com/

你可能感兴趣的文章
项目中用到小技术点
查看>>
管理数据库连接不得不注意的地方
查看>>
KS系统总结
查看>>
测试Jsp 静态包含和动态包含
查看>>
简析几种常用的Web监听
查看>>
Web应用过滤器Fileter
查看>>
代理模式(Proxy)
查看>>
采用动态代理对事务进行封装
查看>>
采用ThreadLocal维护Connection
查看>>
测试JSTL表达式
查看>>
一口一口吃掉Struts(六)——动态ActionForm
查看>>
一口一口吃掉struts(七)——ActionForward知多少
查看>>
浅析Hibernate映射(二)——关系映射(3)
查看>>
浅析Hibernate映射(四)——组件映射(component)
查看>>
Hibernate性能优化
查看>>
Spring核心ioc
查看>>
SSH框架总结(框架分析+环境搭建+实例源码下载)
查看>>
Struts2+Spring3+Mybatis3开发环境搭建
查看>>
mongoDB入门必读(概念与实战并重)
查看>>
通俗易懂解剖jbpm4
查看>>