汇编之寄存器

8086寄存器组

数据寄存器

这些寄存器可以字(16位)或字节(8位)单位形式访问
数据寄存器中每个寄存器又可以分为2个8位的寄存器。分别为AH、AL,BH、BL,CH、CL,DH、DL。H表示高字节(高8位)寄存器、L表示低字节(低8位)寄存器。例如 用AX寄存器存放一个字1234H,表示为(AX)=1234H,即高字节12放在AH,低字节34放在AL中
1. AX accumulator
2. BX base
3. CX count
4. DX data

段寄存器
  1. CS code segment
  2. DS data segment
  3. ES extra segment
  4. SS stack segment
地址寄存器

这些寄存器只能以字(16位)单位形式访问
地址寄存器包括指针和变址寄存器SP、BP、SI、DI四个16位寄存器。顾名思义,它们可用来存放存储器操作数的偏移地址。另外,它们也可以作为通用寄存器用
1. SI source index
2. DI destination index
3. SP stack pointer
4. BP base pointer

控制寄存器
  1. IP instruction pointer 指令指针

    IP 指令指针寄存器,用来存放代码段中的偏移地址,指出当前正在执行指令的下一条指令所在单元的偏移地址

  2. SP stack pointer 栈指针

  3. FLAGS (又称为PSW程序状态字) 标志位寄存器,两个16位寄存器。用于控制程序的执行

FLAGS 标志位寄存器单独介绍

FLAGS标志寄存器中的某位代表CPU的1个标志,表示出CPU的某种执行状态。最低位为D0,最高位为D15。8086CPU的标志寄存器共有9个标志,分别为6个条件码标志和3个控制标志。如图:

flags寄存器

条件码标志
  1. CF进位标志。当指令执行结果的最高位向前有进位时,CF=1,否则CF=0。
  2. SF符号标志。当指令执行结果的最高位(符号位)为负时,SF=1,否则SF=0。
  3. ZF零标志。当指令执行结果为0时,ZF=1,结果不为0时,ZF=0。
  4. OF溢出标志。当指令执行结果有溢出(超出了数的表示范围)时,OF=1,否则OF=0。
  5. AF辅助进位标志。当指令执行结果的第3位(半字节)向前有进位时,AF=1,否则AF=0。
  6. PF奇偶标志。当指令执行结果中1的个数为偶数个时,PF=1,否则PF=0。
控制标志
  1. DF方向标志。执行串处理指令时,若设置DF=0,存储单元的地址寄存器的值自动增加,若设置DF=1,存储单元的地址寄存器的值自动减小。
  2. IF中断标志。设置IF=1,允许CPU响应可屏蔽中断,IF=0则不响应。
  3. TF陷阱标志。在DEBUG调试时,TF=1,采用单步执行方式,即进入陷阱;TF=0,正常执行程序。
例: 两个二进制数相加运算,有关标志位自动发生变化。

二进制计算
根据计算结果可知CPU会自动地把标志位设为:CF=0,SF=1,ZF=0,OF=0,PF=0,即无进位,结果为负数,结果不为0,没有溢出,奇数个1

DEBUG下的标志位表示
标志名标志值为1值为0
进位标志CFCYNC
符号标志SFNGPL
零标志ZFZRNZ
溢出标志OFOVNV
辅助进位标志AFACNA
奇偶标志PFPEPO
方向标志DFDNUP
中断标志IFEIDI

数的补码表示

在计算机中,对带符号数可用真值和机器数两个概念表示。真值,就是带有“+”、“-”号的实际数值;所谓机器数,则是把“+”、“-”符号数值化(0、1)后所得到的计算机实际能表示的数。
机器数有三种码表示,分别是原码、反码和补码。汇编语言中,数都是以补码的形式表示的,因此必须掌握数的补码表示和补码的运算。这三种码的定义如下:
1. 原码。原码将最高位作为符号位,正数为0,负数为1,其余7位作为数值位。
2. 反码。正数的反码与正数的原码一样。而求负数的反码时,符号位为1,数值位在原码的基础上求反。
3. 补码。正数的补码与正数的原码一样。求负数的补码时,符号位为1,数值位在原码的基础上求反加1。

例 十进制数+5和-5分别表示成二进制数原码、反码和补码。
[+5] 原=[+5] 反=[+5] 补=00000101B
[-5] 原=10000101B
[-5] 反=11111010B
[-5] 补=11111011B

在早期的x86架构的汇编语言,如果你想将AX寄存器的二进制值转换成十进制并显示到屏幕上,可以按照以下步骤编写程序: 1. **设置标志位**: 首先,我们需要清零小数点标志CF(Carry Flag),因为我们将直接处理整数部分。 ```assembly ; 清除CF flag xor al, al ; AL = 0 ``` 2. **循环计算十进制值**: 使用`add al, [number in AX]`来逐位累加AX的内容。由于AX最多包含两个字节(16位),从右向左每一位都乘以10。如果最高位有进位,则需要保存进位,并更新下一个位置的数值。 ```assembly mov bl, 0 ; 初始化BL用于保存进位 display_loop: add al, ah ; 将AH(高8位)加入AL(低8位) adc bl, 0 ; 如果有进位,就将bl加上 push ax ; 保存结果,因为下一次循环可能需要回溯进位 loop display_loop ; 当AL=0时退出循环 ; 当前的AX现在存储的是十进制的最后一位,bl存储着进位 ``` 3. **显示十进制数值**: 这一步通常会涉及到I/O操作,比如通过打印函数或ASCII码映射。这里假设有一个名为`print_digit`的简单函数来输出一个数字(注意这只是一个简化版本,实际的I/O操作会更复杂)。 ```assembly ; 假设print_digit(num)函数接收一个数并将其显示出来 call print_digit pop ax ; 回溯保存的进位 jnz display_loop ; 若还有进位,继续循环直到AF全为0 ``` 4. **显示结束符**: 最后,你可以选择显示一个分隔符,比如逗或者空格,来分割每个数字。 请注意,这个示例仅适用于非常基础的情况,并且假设你已经有了相应的输入/输出功能以及一个简单的显示单个数字的函数。在现代的计算机系统,这种手动处理已经很少见,操作系统和库函数通常提供了更为便捷的方式来完成这样的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值