美文网首页
汇编学习11 标志寄存器

汇编学习11 标志寄存器

作者: 官总哦 | 来源:发表于2019-04-28 19:55 被阅读0次

标志寄存器一共16位,一共只有0,2,4,6,7,8,9,10,11位有意义
分别是CF(carry),PF(parity),AF,ZF(zero),SF(sign),TF(中断的单步执行标志,不进行详细介绍),IF(屏蔽外中断标志,不进行详细介绍),DF(direction),OF(overflow)

补充:9个有效标志位中,有3个是控制标志位(DF,IF,TF),6个记录位。

1.ZF位
零标志位,记录上一次运算相关指令执行结束后,其结果是否为0
ZF = 0:上一次运算指令执行结果不为0
ZF = 1:上一次运算指令执行结果位0

2.PF标志位
奇偶标志位,记录相关指令执行后其结果的所有bit位中,1的个数为奇数还是偶数
PF = 0:1的个数为奇数
PF = 1:1的个数为偶数

3.SF标志位
符号标识位,记录相关指令执行以后,其结果是否为负数
SF = 0:结果为非负数
SF = 1:结果为负数
注意:SF寄存器只在有符号数计算中有意义,若CPU进行的是无符号计算,则虽然SF的值也会受到影响,但是其值并没有意义

4.CF标志位
进位(借位)标志位,记录相关指令执行以后,其结果(无符号数)是否进位
CF = 0:结果没有进位(借位)
CF = 1:结果存在进位(借位)
注意:CF寄存器针对于的是无符号数的进位

5.OF标志位
溢出符号位,记录相关指令执行以后,其结果(有符号数)是否溢出
OF = 0:没有发生溢出
OF = 1:发生了溢出
注意:OF溢出是指的有符号数的溢出,而CF指的是无符号数的进位,两者之间相互独立, 没有关系

以上标志寄存器衍生指令:

  • ADC指令:执行加法的时候加上CF的值;
    所以可以利用add,adc指令执行高位数据的加法
  • SBB指令: 执行减法时减去CF(带借位的减法指令)
  • CMP指令:cmp 1,2 代表的是执行1-2的运算,但是并不保存结果值,只根据结果调整标志位的值。cmp指令伴随条件跳转指令一同使用,可以达到跳转的效果

cmp指令修改标志寄存器的值,搭配条件跳转指令(je,jne,jb,jnb,ja,jna等)根据cmp修改的标志寄存器CF和ZF的值决定是否跳转

6.DF标志位
方向标志位,用于串传送指令中,作用于SI和DI寄存器
DF = 0:SI和DI加一
DF =1:SI和DI减一
注意:修改DF的指令为:cld(将DF置0,用于递加);std(将DF置1,用于递减)
以上两个指令要配合movsb(movsw)指令使用达到串传送效果

  • movsb指令是将DS:SI位置处的字节信息传送到ES:DI位置中去,然后再根据DF寄存器的值,对SI和DI进行修改(movsw功能几乎相同,只不过是以字为单位进行传送)
  • rep movsb指令,相当于
    S: movsb
    \ loop
    根据CX的值,重复执行串传送指令

示例代码:
题目:利用串传递指令,将F000H段中的最后16个字符复制到data段中。

assume cs:code, ds:data
data segment
  db 16 dup (0)
data ends

code segment
start:
  mov ax,0F000H
  mov ds,ax
  mov si,0FFFFH ;段的最后一个字节
  mov ax,data
  mov es,ax
  mov di,15
  mov cx,16

  std ;设置DI,SI逆向传输数据
  rep movsb
  mov ax,4c00H
  int 21H
code ends
start end

7.标志寄存器的压栈和出栈:PUSHF和POPF

  • 将标志寄存器(16位)压栈PUSHF
  • 将标志寄存器出栈POPF
    以上两个指令提供了一种直接访问(修改)标志寄存器的方法

实验说明:

将数据段中以0结尾的字符串的所有小写字母变为大写字母
注意!进行转化的是小写字母,而不是其他字符
参考程序:

assume cs:code

datasg segment
    db "Beginner's All-purpose Symbolic Instruction Code.",0
datasg ends

code segment 
start:  mov ax,datasg
    mov ds,ax
    mov si,0
    call letterc
    mov ax,4c00H
    int 21H

letterc:    mov cl,ds:[si]
    mov ch,0
    jcxz done ; 判断取到的字符是否为0
    cmp cl,97 
    jb next ; 小于97则跳转
    cmp cl,122
    ja next ; 大于122则跳转
    and cl,11011111b
    mov ds:[si],cl
next:   inc si
    loop letterc
    
done:   ret

code ends
end start

实验结果:

1234.GIF

实验总结:
(1)注意灵活运用条件跳转指令,找出那些小写字母
(2)小写字母转换为大写字母可以and一个二进制数11101111(其ASCii码只在第五位有差别)

相关文章

  • 汇编学习11 标志寄存器

    标志寄存器一共16位,一共只有0,2,4,6,7,8,9,10,11位有意义分别是CF(carry),PF(par...

  • 汇编笔记5(标志与中断)

    第11章(标志寄存器): 标志寄存器都是16位 flag:按位起作用...

  • 9.汇编-JCC

    9.汇编-JCC 之前可以修改EIP寄存器的指令JMP,CALL,RETN 所有JCC指令的动作->根据标志寄存器...

  • 认识ARM64汇编

    [TOC] 之前说过学习汇编就是学习寄存器和指令,查看代码请连接真机。 寄存器 在arm64汇编中寄存器是64bi...

  • 【8086汇编】-- 常用寄存器

    学习汇编最重要的是就是学习寄存器和指令,8086汇编拥有14个16位的寄存器,分别AX、BX、CX、DX、SI、D...

  • 通用寄存器和初识汇编

    title: 通用寄存器date: 2018-12-11tags:- 滴水逆向- 汇编- 32位通用寄存器cate...

  • 有关汇编相关参考博客

    汇编之常识(一)汇编基础 CPU等硬件结构 数据总线 地址总线 控制总线 汇编之寄存器(二)寄存器 数据地址寄存器...

  • 汇编简介

    学习汇编两大知识点:1.汇编指令2.寄存器 64bit:RAX \RBX\RCX\RDX :通用寄存器32bit:...

  • IOS arm64常用的汇编

    导论 生成汇编文件 寄存器 arm64 汇编条件域 arm64 汇编指令 总结 1. 生成汇编文件 2. 寄存器 ...

  • ARM64汇编

    一般来说学习汇编可以从寄存器、指令、堆栈入手,下面我们慢慢学习: 生成汇编文件: xcrun --sdk ipho...

网友评论

      本文标题:汇编学习11 标志寄存器

      本文链接:https://www.haomeiwen.com/subject/ylrjnqtx.html