汇编语言程序设计-8-汇编语言快速查阅

8. 汇编语言快速查阅


本章列出一些需要经常查阅的知识点。


常用资料

寄存器含义

8086CPU中的16个寄存器:

  • 通用寄存器:AX(ah/al)、BX(bh/bl)、CX(ch/cl)、DX(dh/dl)
  • 变址寄存器:SI、DI
  • 指针寄存器:SP、BP
  • 指令指针寄存器:IP
  • 段寄存器:CS、SS、DS、ES
  • 标志寄存器:PSW

其中

  • CS:IP 表示要执行的指令地址
  • SS:SP 表示栈指针所在地址

标志寄存器的含义

  本节介绍8086CPU中的标志寄存器 FLAGS,也称为程序状态字。标志寄存器可用于存储相关指令的某些执行结果、为CPU执行相关指令提供行为依据、控制CPU的相关工作方式等。FLAGS 寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。有含义的位如下图所示:

表8-1 8086CPU中的标志寄存器
标志位含义值为1值为0
OF溢出标志(Overflow Flag)OV(Overflow)NV(No Overflow)
DF方向标志(Direction Flag)DN(Down)UP
IF中断标志(Interrupt Flag)EI(Enable Interrupts)DI(Disable Interrupts)
TF陷阱标志(Trap Flag)--
SF符号标志(Sign Flag)NG(Negative)PL(Positive)
ZF零标志(Zero Flag)ZR(Zero)NZ(Not Zero)
AF辅助进位标志(Auxiliary Carry Flag)AC(Auxiliary Carry)NA(No Auxiliary carry)
PF奇偶标志(Parity Flag)PE(Parity Even)PO(Parity Odd)
CF进位标志(Carry Flag)CY(Carry)NC(No Carry)
图5-2 debug中的状态寄存器
  • OF-溢出标志(Overflow Flag):将运算当作有符号数运算,若结果溢出则OF=1、无溢出则OF=0。
  • DF-方向标志(Direction Flag):在串处理指令中,控制每次操作后si,di的增减。具体见“5.14节-DF标志和串传送指令”。
  • IF-中断标志(Interrupt Flag):控制硬件中断的响应。1表示启用硬件中断,CPU可以响应由外部设备产生的中断请求;0禁用硬件中断,CPU忽略外部设备的中断请求。示例见“6.13节-外设连接与中断-sti/cli”。
  • TF-陷阱标志(Trap Flag):控制单步调试。1启用单步模式,每执行一条指令后,CPU会产生一个单步中断(INT 1),允许调试程序检查CPU状态;0禁用单步模式,CPU正常执行指令,不会在每条指令后产生中断。详见“6.8节-单步中断”。
  • SF-符号标志(Sign Flag):运算指令执行后,将结果视为有符号数(补码),结果为负数则SF=1、非负数则SF=0。
  • ZF-零标志(Zero Flag):运算指令执行后,计算结果是否为0。结果为0则ZF=1、结果非0则ZF=0。
  • AF-辅助进位标志(Auxiliary Carry Flag):用于在二进制运算过程中检测从低四位(即低半字节)到高四位(高半字节)的进位或借位情况。它主要用于支持BCD(Binary-Coded Decimal,二进制编码十进制)运算。1表示低四位有向高四位的进位/借位,0表示没有。
  • PF-奇偶标志(Parity Flag):运算指令执行后,结果的所有二进制位中1的个数。偶数则PF=1,奇数则PF=0。
  • CF-进位标志(Carry Flag):将运算当作无符号数运算,有向更高位的进位或借位则CF=1、没有则CF=0。

注:OF和CF在含义上几乎一致,但是OF针对有符号数运算、CF针对无符号数运算。
注:有符号数(补码)运算后,双符号位不同则为“溢出”;无符号数计算后,超出范围为“溢出”。——《计算机组成原理》
注:无符号数运算时,SF的值没有意义,但是运算结果仍然会影响SF。

  在8086CPU的指令集中,影响标志寄存器的大都是运算指令,进行逻辑或算术运算;比如 addsubmuldivincorand等。对标志寄存器没有影响的大都是传送指令,比如 movpushpop等。使用一条指令的时候,要注意这条指令的全部功能,其中包括执行结果对标记寄存器的哪些标志位造成影响。最后给出直接访问标志寄存器的方法:

  • pushf:将标志寄存器的值压栈。
  • popf:从栈中弹出数据,送入标志寄存器中。
  • debug模式下,直接使用 r指令可以查看标志寄存器的值。

注:inc不会影响进/借位标志位CF。

Debug的使用

更详细见“2.5节-Debug的使用”。

正常指令:

  • r:查看寄存器。
  • a:直接在内存中写入汇编指令。
  • u:将机器指令翻译成汇编指令。
  • d:查看内存数据。
  • e:覆写内存数据。
  • q:退出debug。

调试相关指令:

  • t(Trace):逐条指令执行,适合详细调试每个指令,相当于“单步执行-步进”
  • p(Procedure step):逐过程执行,适合调试过程中不想深入子过程,相当于“单步执行-步出”。比如会跳过循环。
  • g(Go):连续执行程序,适合运行程序到下一个断点或结束,也可以运行到指定地址。

汇编语法

  1. 数字没有后缀时,默认为十进制。比如 mov ax,12就是十进制的12,而非 0012H。
  2. 数据不能以字母开头,若有需要则需在前面加0。比如 mov ax,0ffffH
  3. 为防止编译错误,对于指令 mov al,[idata],最好加上段前缀,比如 mov al,ds:[idata]
  4. dw定义一个字、db定义一个字节、dd定义一个双字。
  5. 第一条指令标号约定俗成为 start,也可以换成别的字符,比如 begin
  6. 每个循环的标号命名不能相同。
  7. 汇编程序至少包含一个段,也就是代码段,所以无需给 CS 初始化赋值。但是其他段的段寄存器都需要初始化。
  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虎慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值