汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY

在8086CPU中,有一种标记寄存器,长度为16bit;

其中存储的信息被称为程序状态字(Program Status Word,PSW),以下将该寄存器简称为flag。

功能:1)用来存储相关指令的某些执行结果;

2)用来为CPU执行相关指令提供行为依据;

3)用来控制CPU的相关工作方式。

flag寄存器各位示意图

注明:16位中未标明字符的各位在8086CPU中没有使用,无意义;

标明字符的各位具有特殊含义。

位     符号    英文全称                             中文名称              说明(数学或逻辑运算)

0      CF      Carry Flag                          进位标记位           无符号数运算结果是否进位/借位

2      PF      Parity Flag                          奇偶标志位           运算结果二进制表示各位为1的个数(奇偶表示)

4      AF      Auxiliary carry Flag              辅助进位标记位      AF=1时,向高位或高字节进位或借位

6      ZF      Zero Flag                           零标志位              运算结果是否为0

7      SF      Sign Flag                            符号标记位           有符号数运算结果的正负

8      TF      Trap Flag                            跟踪标记位           TF=1,产生单步中断,引发中断过程

9      IF       Interrupt-enable Flag           中断允许标记位      IF=1/0,CPU允许中断或关闭中断

10    DF      Direction Flag                      方向标记位           字符串处理指令中DF=0/1,控制每次操作si,di的增减

11    OF      Overflow Flag                      溢出标记位            有符号数运算结果是否溢出

注明:数学或逻辑运算指令才会影响flag,包括add,sub,mul,div,inc,dec,or,and等;

mov,push,pop等传送指令对flag没有影响;

TF跟踪标志(为调试机器或调试程序发现故障而设置):

TF=1,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序;

TF=0,CPU处在连续工作状态。

IF中断允许标记位(可屏蔽中断的中断过程中CPU检测IF确定是否屏蔽中断):

IF=1,CPU执行完当前指令后,响应中断,引发中断过程;

IF=0,CPU执行完当前指令后,不响应中断。

sti,则IF=1;

cti,则IF=0.

各寄存器的详细说明参考:http://www.cnblogs.com/ant-colonies/p/6008322.html

标记寄存器在Debug中的表示
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=**** ES=**** SS=**** CS=**** IP=0100 NV UP EI PL NZ NA PO NC                                  
位    标志     值为1的标志                  值为0的标志
0     CF      CY(CarrY)                     NC(Not Carry)
2     PF       PE(Parity Even)             PO(Parity Odd)
4     AF      AC(Auxiliary Carry)        NA(No Auxiliary carry)
6     ZF      ZR(ZeRo)                     NZ(Not Zero)
7     SF      NG(NeGative)                PL(Positive)
9     IF       DI(Disabled Interrupt)    EI(Inabled Interrupt)
10   DF      DN(DowN)                    UP(Up)
11   OF      OV(Overflow)                NV(Not Overflow)

标记位CF与OF:

adc是带进位的加法指令
指令格式:adc object1,object2      
功能:object1=object1+object2+CF
举例:adc ax,bx即 (ax)=(ax)+(bx)+CF

sbb是带借位的减法指令
指令格式:sbb object1,object2      
功能:object1=object1-object2-CF
举例:adc ax,bx即 (ax)=(ax)-(bx)-CF

注:adc和sbb可以用于解决add,sub运算时的进位无法存储的问题;

adc(add & CF),带进位的加法;

sbb(sub & below),带错位的减法;

标志位CF与OF的比较:

1111 1111      8bit表示范围               对应标志位      超出表示范围时
2^8-1(255)     无符号数[0,255]         CF                 向更高位发生进位或借位
2^7-1(127)     有符号数[-128~127]   OF                 发生溢出

cmp指令    
指令格式:cmp object1,object2
功能:计算操作对象object1-object2,但不保存结果,仅根据计算结果对标志寄存器进行设置
举例:
  cmp ax,ax                        ;(无符号数之间的比较)
  执行后ax值不变,zf=1,pf=1,cf=0,of=0 ;
  mov ax,8
  mov bx,3
  cmp ax,bx
  执行后:(ax)=8,zf=0,pf=1,cf=0,of=0。

指令 cmp ax,bx    (无符号数之间比较,参考的标记位zf,cf)
zf=1,则(ax)=(bx)
zf=0,则(ax)!=(bx)
cf=1,则(ax)<(bx)
cf=0,则(ax)>=(bx)
cf=0且zf=0,则(ax)>(bx)
cf=1或zf=1,则(ax)<=(bx)

指令 cmp ah,bh     (有符号数之间比较,参考的标记位sf,of,zf)  
sf=1,且of=0,则(ah)<(bh)
sf=1,且of=1,则(ah)>(bh)
sf=0,且of=1,则(ah)<(bh)
sf=0,且of=0,则(ah)>=(bh)

条件转移指令:
  "转移"的本质是——修改IP;"条件"指的是可以根据某种条件,决定是否修改IP
  所有条件转移指令的转移位移范围为[-128,127]
  1)jcxz,即当(cx)=0时,即修改IP(实现转移)
  2)被cmp指令影响标记寄存器标记位,与以下条件转移指令配合使用
  常用的根据无符号数的比较结果进行转移的条件转移指令:
  指令              含义                 检测相关的标志位
  je                 等于则转移          zf=1
  jne               不等于则转移       zf=0
  jb                 小于则转移         cf=1
  jnb               不小于则转移      cf=0
  ja                 大于则转移         cf=0且zf=0
  jna               不大于则转移       cf=1或zf=1
 
  注:j-jmp  
      e-equal   ne-not equal
      b-below  nb-not below
      a-above  na-not above

标记位DF与串传送指令:

df(direction flag),方向标志位,控制每次操作后si,di的增减
  df=0,si,di递增
  df=1,si,di递减
字符串传送指令:
格式:movsb                   ;mov string byte
功能:1)((es)*16+(di))=((ds)*16+(si))
             即:mov es:[di],byte ptr ds:[si]
      2)当df=0, (si)=(si)+1
                    (di)=(di)+1
             即:inc si
                  inc di
        当df=1, (si)=(si)-1
                   (di)=(di)-1
             即:dec si
                   dec di

格式:movsw                   ;mov string word
功能:1)((es)*16+(di))=((ds)*16+(si))
             即:mov es:[di],word ptr ds:[si]
      2)当df=0, (si)=(si)+2
                    (di)=(di)+2
             即:add si,2
                  add di,2
        当df=1, (si)=(si)-2
                   (di)=(di)-2
             即:sub si
                   sub di     
一般movsb/movsw与rep配合使用   ;rep-repeat
格式:rep movsb
    即:s:movsb
          loop s       ;所以rep的作用是根据cx的值,进行重复串传送
          
设置df的指令:
  cld                    ;将df置0,字符串传送——偏移地址递增的方向      clear df
  std                   ;将df置1,字符串传送——偏移地址递减的方向      set df

assume cs:code,ds:data

data segment
  db ‘Welcome to masm!‘            ;将此字符串复制到相同段地址,偏移地址为16的内存位置
  db 16 dup (0)
data ends

code segment
  start: mov ax,data
         mov ds,ax
         mov es,ax
	 mov si,0
	 mov di,16
	 mov cx,8
	 cld
	 rep movsw

	 mov ax,4c00h
	 int 21h
code ends
end start

 pushf和popf:

pushf的功能——将标记寄存器的值压栈;

popf的功能——出栈,将值送入标记寄存器中。

注:此文参考网络和《汇编语言》(王爽,第二版)

时间: 2024-10-12 07:07:49

汇编语言标记寄存器标记位_NV UP EI NG NZ AC PE CY的相关文章

汇编语言标志位 含义 NV UP EI NG NZ AC PE CY

缩写原意: Overflow of = OV NV [No Overflow] Direction df = DN (decrement) UP (increment) Interrupt if = EI (enabled) DI (disabled) Sign sf = NG (negative) PL (positive) Zero zf = ZR [zero] NZ [ Not zero] Auxiliary Carry af = AC NA [ No AC ] Parity pf = P

System.Xml.XmlException: “=”是意外的标记。标记应为“;”

使用.NET XmlDocument对象LoadXml(string xml)行为从指定字符串加载XML过程中报了一个错: “=”是意外的标记.标记应为“;”. 第 1 行,位置 567. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Xml.XmlException: “=”是意外的标记.标记应为“;”. 第 1 行,位置 567. 源错误: 行 60: else if (menu

[2016-01-13][html][文档设置标记-格式标记]

html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h

汇编语言---使用寄存器

汇编语言,使用寄存器 本书已经讲到对于我们为什么要使用变量--因为我们在编程时要存储数据.我们也已经学了,在汇编语言中,我们将数据存储在寄存器和内存空间中. 下面我们来探讨,在c语言中如何使用寄存器和内存空间 1.首先在c:\minic 目录下的tc.exe编写一个ur1.c程序 编译.链接成ur1.exe 2.用debug加载ur1.exe,用u命令查看ur1.c编译后的机器码和汇编代码 根据我们汇编语言学习的经验,main函数代码应该存放在code段中,我们可以通过反汇编找到main函数相应

去除字符串中的html标记及标记中的内容

--1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varchar(8000) as begin declare @i int while 1 = 1 begin set @i=len(@maco) set @maco=replace(@maco, substring(@maco,charindex('<',@maco), charindex('>',@maco)-charindex('<',@

连通区域标记 --轮廓标记算法

算法的整体描述: 1.从上到下,从左到右,依次遍历整幅图像 2.如上图A所示,A点为遇到的外轮廓点(步骤1遍历的过程中遇到的第一个像素值为255的点即为外轮廓点),且没有被标记过,则给A一个新的标记号;从A点出发,按照一定的规则,将A所在的外轮廓点全部跟踪到,然后回到A点,并将路径上的点全部标记为A的标号. 3.如上图B所示,如果遇到已经标记过的点A',则从A'开始向右,将它的右边所有的点都标记为A'的标号,直到遇到像素值为0的点为止. 4.如上图C所示,如果遇到了一个已经标记的点B,且是内轮廓

定制标记---传统标记处理器

1.传统标记处理器API 2.传统标记处理器生命周期 3.传统标记生命周期取决于返回值 和简单标记处理器不同,容器可以重用传统标记处理器对象,因此最好在doStartTag()中重置实例变量值,否则,这个代码可能只能在第一次能正常工作. 4.如果需要访问体内容 如果需要访问体内容,标记处理器需要扩展BodyTagSupport而不是TagSupport.基于BodyTag,你会得到两个新方法,doStartTag()也有了一个新的返回值:EVAL_BODY_BUFFERED.标记有了新的生命周期

汇编语言——标志寄存器

标志寄存器 flag 和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义. 而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息. 8086CPU的flag寄存器的结构: ZF标志 flag的第6位是ZF,零标志位(zero flag). 它记录相关指令(add.sub.mul.div.inc.or.and操作)执行后,结果是否为0 .ZF = 1结果不为0,ZF = 0结果为0. mov.push.pop等传送指令不修改标志寄存器的信息.

汇编语言-环境搭建(32位)

一 系统环境 win7 旗舰版 x86_64 二 安装IDE RadASM.v2.2.1.9.cao_cong 三 目前在这个版本中遇到的坑 1 这个IDE的光标对中文兼容性不太好, 当调大编辑区的字体, 或者调整tab的显式空格数的时候, 有可能会出现光标跟当前的字符出现一段距离的bug 2 变量类型在".data"区可以使用缩写, 在.code区只能使用类型名的全称 3 关于"offset 变量名"与 "lea register, 变量名"(