首页 > 程序开发 > 软件开发 > 其他 >

汇编语言笔记解析

2018-07-23

汇编语言笔记解析。每个标志寄存器都有它特殊的含义,下面我们将一一介绍他们的含义及用途 ZF 称为零标志位(Zero Flag) 它记录了相关指令执行后, 其结果是否为 0 如果结果为 0, 则 ZF=1; 如果结果不为 0, 则 ZF = 0 至于哪些指令的执行会影响 ZF 标记位, 则要参考该指令的

章节目录

简介 ZF 标志寄存器 PF 标志寄存器 SF 标志寄存器 CF 标志寄存器 OF 标志寄存器 几条相关指令 DF 标志寄存器 PUSHF and POPF 标志寄存器

简介

8086 CPU 寄存器的结构如下如:

这里写图片描述

每个标志寄存器都有它特殊的含义,下面我们将一一介绍他们的含义及用途.

ZF

ZF 称为零标志位(Zero Flag). 它记录了相关指令执行后, 其结果是否为 0. 如果结果为 0, 则 ZF=1; 如果结果不为 0, 则 ZF = 0. 至于哪些指令的执行会影响 ZF 标记位, 则要参考该指令的说明了.

示例:

  mov ax, 1
  sub ax, 1
  // 执行上述指令之后, ZF = 1

  mov ax, 2
  sub ax, 1
  // 执行上述指令之后, ZF = 0

PF

PF 称为奇偶标记位(Parity Flag). 它记录了执行相关指令之后, 其结果的所有 bit 中 1 的个数是否为偶数. 如果 1 的个数为偶数个, 则 PF = 1; 如果为奇数个, 则 PF = 0. (0 是偶数, 因此,如果某个指令执行之后结果为 0 且该指令会影响 PF 标志位, 此时 PF = 1),

示例:

  mov al, 1
  add al, 10
  // 执行上述指令之后, 结果为 00001011B, 有三个 '1', 则 PF = 0

  mov al, 1
  add al, 11
  // 执行上述指令之后, 结果为 00001100B, 有四个 '1', 则 PF = 1

SF

SF 称为符号标记位(Sign Flag). 它记录了执行相关指令之后, 其结果是否为负数. 如果是负数, 则 SF = 1; 如果不为负数, 则 SF = 0.

CF

CF 称为进位寄存器(Carry Flag). 一般情况下, 在进行无符号数运算的时候, 它记录了运算结果的最高有效位向更高位的进位值, 或从更高位的借位值.

比如, 我们要计算 98H 加 98H 的两个八位数据, 计算结果为 130H. 而 120H 超过了八位寄存器所能存储的最大值, 因此会产生进位.

  mov al, 98H
  add al, al // 执行上述指令之后, AL = 30H, CF = 1. 
  add al, al // 执行这条指令之后, AL = 60H, CF = 0

同样的, 当我们要计算 98H 减去 99H 时, 就需要借位.

  mov al, 98H
  sub al, 99H// 执行这条指令之后, AL = FFH, CF = 1. 
  sub al, al // 执行这条指令之后, AL = 00H, CF = 0.

ADC 指令

ADC 是带进位加法指令. 它利用了 CF 标志位上记录的进位值.
指令格式: adc num1, num2
功能: num1 = num1 + num2 + CF

示例:

  mov ax, 2
  mov bx, 1
  sub bx, ax
  adc ax, 1
  // 执行上述指令之后, ax = 4. 
  // adc ax, 1 等价于 ax + 1 + CF = 2 + 1 + 1 = 4.

SBB 指令

SBB 是带借位减法, 它利用了 CF 标志位上记录的借位值.
指令格式: sbb num1, num2
功能: num1 = num1 - num2 - CF

示例:

  mov bx, 1000H
  mov ax, 003EH
  sub bx, 2000H
  sbb ax, 0020H 
  // sbb ax, 0020H1 等价于 ax - 0020H - CF.

OF

OF 称为溢出标志位(Overflow Flag). 一般情况, OF 记录了有符号数运算结果是否发生了溢出. 如果发生溢出, 则 OF = 1; 如果没有溢出, 则 OF = 0.

  mov al, 98
  add al, 99
  // 执行上述指令之后, 则会发生溢出. 8 位寄存机能存储的值的范围为 -128-127. 
  // 98 + 99 = 197. 197 超出了 8 位寄存器的存储范围. 因此, CF = 0, OF = 1.  

这里注意 CF 和 OF 的区别:

CF 对无符号数运算有意义
OF 对有符号数运算有意义

几条相关指令

CMP 指令

指令格式: cmp num1, num2
功能: 计算 num1 - num2 但不保存结果. 但根据计算结果对标志寄存进行设置.

示例:

  mov ax, 8
  mov bx, 3
  cmp ax, bx
  // 执行上述指令之后, ZF = 0, PF = 1, SF = 0, CF = 0, OF = 0

常用相关指令

指令 含义 检测的标志位
JE 等于则转移 ZF=1
JNE 不等于则转移 ZF=0
JB 小于则转移 CF=1
JNB 大于等于则转移 CF=0
JA 大于则转移 CF=0 && ZF = 0
JNA 小于等于则转移 CF=1 && ZF = 1

DF

DF 称为方向标志位(Direction Flag). 在串处理指令中, 控制每次操作后 SI, DI 的增减.
DF = 0 每次操作后 SI, DI 递增
DF = 1 每次操作后 SI, DI 递减

PUSHF and POPF

PUSHF 的功能是将标志寄存器的值压栈
POPF 的功能室将标志寄存器的值出栈, 送入标志寄存器中.

欢迎交流任何想法.

End…

相关文章
最新文章
热点推荐