通用寄存器与标志位寄存器OF/DF/IF/TF/SF/ZF/AF/PF

简介: 作者主页:https://www.couragesteak.com/

1 通用寄存器

这些的寄存器是程序执行代码最最常用,也最最基础的寄存器,程序执行过程中,绝大部分时间都是在操作这些寄存器来实现指令功能。
所谓通用,即这些寄存器CPU没有特殊的用途,交给应用程序“随意”使用。注意,对于有些寄存器,CPU有一些潜规则,用的时候要注意。

eax:通常用来执行加法,函数调用的返回值一般也放在这里面
ecx:通常用来作为计数器,比如for循环
edx:读写I/O端口时,edx用来存放端口号
esp:栈顶指针,指向栈的顶部
ebp:栈底指针,指向栈的底部,通常用ebp+偏移量的形式来定位函数存放在栈中的局部变量
esi:字符串操作时,用于存放数据源的地址
edi:字符串操作时,用于存放目的地址的,和esi两个经常搭配一起使用,执行字符串的复制等操作
eip:指向CPU当前指向的指令
ebx: 数据存取

2 标志寄存器

CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能)具有以下3中作用。

  1. 用来存储相关指令的某些执行结果。
  2. 用来为CPU执行相关指令提供行为依据。
  3. 用来控制CPU的相关工作方式。

8086CPU的flag寄存器的结构如图下所示

D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
OF DF IF TF SF ZF AF PF CF

空出来的说明在8086CPU中没有使用,布局有任何含义。
它反映了CPU运算的状态特征并且存放某些控制标志

2.1 CF 进位标志位

定义:当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。

实例:

1. 修改 eax:FFFFFFFF
2. 写指令
add eax,0x1

3.结果:
eax:00000000
C:  1
A:1

2.2 ZF 零标志位

定义:若当前的运算结果为零,则ZF为1,否则为0。

  1. flag的第6位是ZF,0标志位。
  2. 记录相关指令执行后,其结果是否为0,
    if = 0; zf = 1
    if != 0; zf = 0
    eg.

    mov ax,1
    sub ax,1
    执行后,结果为0,则zf=1
    mov ax,1
    add ax,0
    执行后,结果为0,则zf=1,表示“结果是0”
    mov ax,1
    or ax,0
    执行后,结果不为0,则zf=0,表示“结果非0”

2.3 SF 符号标志位

定义:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。

2.4 OF 溢出标志位

若运算结果超出机器能搞表示的范围称为溢出,此时OF为1,否则为0。

2.5 PF 奇偶标志位

定义:当运算结果的最低16位中含1的个数位偶数,则PF为1,否则为0。

  1. flag的第2位是PF,奇偶标志位。
  2. 记录相关指令执行后,其结果的所有bit位中1个数是否为偶数,
    if 偶数 则 pf = 1
    if 奇数 则 pf = 0
    eg.

    mov al,1
    add al,10
    执行后,结果为00001011B,其中3(奇数)个1,则 pf = 0;
    mov al,1
    or al,2
    执行后,结果为00000011B,其中有2(偶数)个1,则 pf = 1;
    sub al,al
    执行后,结果为00000000B,其中有0(偶数)个1,则 pf = 1;

2.6 AF 辅助进位标志

定义:一个加法(减法)运算结果的低4位想高4位有进位(或借位)时,则AF=1,反之AF=0。

2.7 TF 跟踪标志

定义:该标志位为方便程序调试而设置。若TF=1,8086/8088 CPU处于单步工作方式,即在每条指令执行结束后,产生中断。

2.8 DF 方向标志

定义:该标志位用来控制处理指令的处理方向,若DF=1,则串处理过程中地址自动递减,否则自动递增。

2.8 IF 中断标志

等等

相关文章
|
24天前
|
Linux
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
嵌入式Linux系统(NUC980)tf卡出错处理errors=remount-ro改为errors=continue
7 1
|
8月前
|
网络协议 BI 调度
NR PRACH(五) type1 RA(4-step)基本过程
无线通信,最重要的前提是建立接收端和发射端之间的时间同步。
|
9月前
|
编解码 人工智能 算法
Rasterio:rasterio.open函数参数和用法解析(以GPM Imerg Early nc转tif为例)
Rasterio:rasterio.open函数参数和用法解析(以GPM Imerg Early nc转tif为例)
230 0
r14/lr寄存器的值
r14/lr寄存器的值
274 0
r14/lr寄存器的值
成功解决smtplib.SMTPAuthenticationError: (535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb
成功解决smtplib.SMTPAuthenticationError: (535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb
|
监控 Linux
通过msr-tools读取CPU寄存器的值
通过msr-tools工具包可以用来来读取或写MSR寄存器值。 MSR是Model Specific Register的全称。 MSR是为了设置CPU 的工作环境和标示CPU 的工作状态,包括温度控制,性能监控等     1.
6410 0
|
机器学习/深度学习 TensorFlow 算法框架/工具
|
安全 Shell
[PWN][高级篇]利用ROP-ret2Syscall突破NX保护(上)
[PWN][高级篇]利用ROP-ret2Syscall突破NX保护
167 0
[PWN][高级篇]利用ROP-ret2Syscall突破NX保护(上)
|
NoSQL Shell
[PWN][高级篇]利用ROP-ret2Syscall突破NX保护(下)
[PWN][高级篇]利用ROP-ret2Syscall突破NX保护
104 0
[PWN][高级篇]利用ROP-ret2Syscall突破NX保护(下)
|
存储
汇编(四)字的存储、DS和[address]、字的传送、mov、add、sub指令、数据段
汇编、汇编语言、编程、汇编编程、字的存储、DS和[address]、字的传送、mov、add、sub指令、数据段、寄存器内存访问、内存单元、字节、字、内存
3199 1