8086汇编——计算机组成原理及8086寄存器、内存储器(附Masm2015下载链接)

一、计算机基本组成

首先就是熟悉的冯·诺依曼的计算机基本结构,运算器,控制器,存储器,输入输出设备,五大部件组成。运算器和控制器合称为中央控制器(CPU)。

  • CPU,主要有算术和逻辑运算单元ALU,地址发生和控制单元,指令译码单元数据寄存器单元,总线驱动单元,时序控制单元等组成。
  • 存储器,就是分为内存外存,在此不多赘述。
  • 输入输出设备,非常常见,典型的显示屏,键盘等。
  • 总线及接口,分为内部总线和外部总线。内部总线指CPU中连接各部件的线。外部总线又称为系统总线,是连接计算机主板上各种芯片及各个接口的线,分为地址总线,数据总线,控制总线。

注:外部设备与计算机主机之间必须有一个中间介质作为缓冲部件,该部件称为接口,串行接口数据一位一位传送,只需要一根数据线。并行接口,同时并行传输多位数据。

二、微型计算机系统

在这里插入图片描述

微处理器

分为执行部件EU和总线接口部件BIU两部分。

  • 执行部件EU:包含运算器的算术逻辑运算单元ALU、通用寄存器组、标志寄存器FLAGS、EC单元控制系统等。
  • 总线接口部件BIU:包含段寄存器组(CS、DS、ES、SS),指令指针寄存器IP,指令队列单元,地址加法器、总线控制系统等。

三、8086寄存器

在这里插入图片描述

1. 数据寄存器
包括AX、BX、CX、DX四个16位的通用寄存器,用于存放计算过程中的所用的操作数。

  • AX 通用寄存器 :主要作为累加器使用
  • BX 通用寄存器 :还用作基址寄存器
  • CX 通用寄存器 :还用作计数器
  • DX 通用寄存器 :在做双精度运算时与AX一起存放一个双字操作数(32位2进制),DX存放高位,AX存放低位。

数据寄存器每一个寄存器又可以分为2个8位的寄存器,分别为AH、AL、BH、BL、(其他的以此类推)H代表高位,L代表低位。
例如:DX、AX存放23456789H。表示为DX=(2345H),AX=(6789H)。
AX存放1234H,则AH=(12H),AL=(34H)。

2.地址寄存器
地址寄存器包括指针和变址寄存器SI、DI、 SP、BP 四个16位寄存器。顾名思义,它们可用来存放存储器操作数的偏移地址(至于改概念随后会说到)。另外,它们也可以作为通用寄存器用。

  • SI源变址寄存器,可用于存放源缓冲区的偏移地址。
  • DI目的变址寄存器,可用于存放目的缓冲区的偏移地址。
  • SP堆栈指针寄存器,用于指出堆栈区栈顶的偏移地址。
  • BP基址指针寄存器,用于指出堆栈区某个单元的偏移地址。

3.段寄存器
8086 CPU有4个16位的段寄存器,分别是CS、DS、ES、 SS。

  • CS 代码段寄存器,用于指出存放程序的代码段的段地址。
  • DS 数据段寄存器,用于指出存放数据的数据段的段地址。
  • ES 附加段寄存器,用于指出存放附加数据的附加段的段地址。
  • SS 堆栈段寄存器,用于指出堆栈区的堆栈段的段地址。

4.控制寄存器
控制寄存器包括IP和FLAGS ( 又称为PSW程序状态字)两个16位寄存器。用于控制程序的执行。
IP指令指针寄存器,用来存放代码段中的偏移地址,指出当前正在执行指令的下一条指令。
FLACS标志寄存器的某位代表CPU的1个标志。有6个条件标志和3个控制标志。条件标志如下:

  • CF 进位标志,当指令执行结果的最高位向前有进位时,CF=1,否则CF=0。
  • SF 符号标志,当指令执行结果的最高位(符号位)为负时,SF=1, 否则SF=0。
  • ZF 零标志,当指令执行结果为0时,ZF=1,结果不为0时,ZF =0。
  • OF 溢出标志,当指令执行结果有溢出( 超出了数的表示范围)时,OF=1, 否则OF =0。
  • AF 辅助进位标志,当指令执行结果的第3位(半字节)向前有进位时,AF=1,否则AF=0。
  • PF 奇偶标志, 当指令执行结果中1的个数为偶数个时, PF=1,否则PF =0。

控制标志如下:

  • DF 方向标志,执行串处理指令时,若设置DF=0,存储单元的地址寄存器的值自动增加,若设置DF=1,存储单元的地址寄存器的值自动减小。
  • IF 中断标志,设置IF=1,允许CPU响应可屏蔽中断,IF=0则不响应。
  • TF 陷阱标志,在DEBUCG调试时,TF=1,采用单步执行方式,即进入陷阱; TF=0,正常执行程序。

在这里插入图片描述

四、内存储器

1.物理地址与逻辑地址

CPU对内存的访问通过地址总线进行,地址总线的每一个二进制组态对应一个存储单元,可作为该存储单元的的地址。比如,系统有10根地址线A9-A0,则有0~1023号不同组合,可以表示1024个存储单元。寻址空间达到1Kb,可以看出,若地址线总数为n,则地址空间的大小单元为2^n。在汇编语言中地址用16进制表示。

  • 物理地址 :这是内存单元的真实地址。存储单元的物理地址唯一。Intel 8086有20根地址线,存储空间达1MB,物理地址范围为00000H~FFFFFH。
  • 逻辑地址 :是用户编程时使用的地址,分为段地址和偏移地址两部分。在8086汇编语言中,把内存地址空间划分为若干逻辑段,每段由一些存储单元构成。用段地址指出是哪- -段,偏移地址标明是该段中的哪个单元。段地址和偏移地址都是16位二进制数。由于段地址和偏移地址有多种组合,则有可能多种逻辑地址组合对应到同一个物理单元上,因此存储单元的逻辑地址不是唯一的。

逻辑地址的形式 :段地址:偏移地址
在这里插入图片描述

2.存储单元

在汇编语言中,把存储单元分为字节单元、字单元、双字单元等,称为存储单元的属性。其中字节单元可存储8位二进制数,用2个相邻的字节单元作为字单元存储16位二进制数,用4个字节单元代表双字单元存储32位二进制数,以此类推即可存放多字节数据。

存储单元中的数据称为存储单元内容,存储单元还有地址,用括号将地址括起来以代表单元的内容。

在这里插入图片描述

(3075AH) = 12H,表示3075AH单元中的内容是12H。
(37692H) =5678H,表示37692H单元和37693H单元一起存放5678H,该单元是字单元。字单元在存储的时候,高字节放在高地址单元,低字节放在低地址单元。即56H放在37693H单元,78H放在37692H单元。

3.存储器分段

8086CPU提供的地址线为20根,可我们知道,8086CPU的地址寄存器只有16位,达不到20位的地址范围。针对这种情况,8086系统采用实模式工作方式下对存储器划分逻辑段的办法解决16位字长机器提供20位地址的问题。

将存储器划分为若干逻辑段,每段最大64K字节单元。逻辑段的大小可变,每段最少16个字节单元,也可到最大65536个字节单元。这样段内单元的地址可用16位二进制数表示,称为偏移地址。每个段的偏移地址可从0000~FFFFH。段地址也是16位的,用于标识是哪一-个段。段地址和偏移地址构成逻辑地址。

那么这就很好理解了,举个例子,有一堆箱子,箱子里也有一堆物品,总体上物品数量极其庞大,那么如何确定并找到任意一个箱子里的任意物品呢?先对箱子进行划分,标号。再对箱子里的物品重新标号。那么我们知道了箱子的号码和箱子里物品的号码,可以直接找到这个物品。段地址就类似箱子的号码,偏移地址就类似于箱子里物品的号码。

同时规定,存储器分段时,各段的起始地址必须是小段的首地址,即逻辑段必须从任一个小段的首单元开始,而不能从其他的字节单元开始。

在将逻辑地址转换为物理地址时,物理地址=段地址x10H+偏移地址,相当于把16位的段地址又恢复为20位,再和偏移地址相加就得到了20位的物理地址。

4.段的类型

我们知道,数据和程序都是以二进制的形式保存在存储器中的,如果不加以区分,将无法获知读取的数据是数值还是指令。所以需要把逻辑段分为几个类型。

  • 代码段 :用于存放指令,段地址存放在段寄存器 CS。
  • 数据段 :用于存放数据, 段地址存放在段寄存器 DS。
  • 附加段 :用于辅助存放数据,段地址存放在段寄存器 ES。
  • 堆栈段 :是重要的数据结构,可用来保存数据、地址和系统参数,段地址存放在段寄存器 SS。
    在这里插入图片描述

在这里插入图片描述

Masm2015下载戳这里
提取码 :9aiq

参考书籍:《汇编语言》第二版 郑晓薇

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个将16进制转换为10进制并输出的8086汇编代码,可以在MASM 2015环境下运行: ``` .model small .stack 100h .data hex db '2A', 0 ;要转换的16进制数 dec dw ? ;存储转换后的10进制数 .code main proc mov ax, @data mov ds, ax ;初始化数据段寄存器 mov si, offset hex ;将要转换的16进制数的地址存储在 SI 中 mov cx, 2 ;设定循环次数为2次(16进制数的位数为2) xor bx, bx ;将 BX 寄存器清零,用于存储转换后的10进制数 convert: mov al, [si] ;将16进制数的低位存储在 AL 中 cmp al, 'A' ;判断是否大于等于'A' jb convert_end ;如果小于'A',跳转到结束 sub al, 7 ;将'A'~'F'转换成10~15 convert_end: sub al, '0' ;将 ASCII 码值转换成数值 mov ah, 0 ;将 AH 寄存器清零 mov cl, 2 ;将 CL 寄存器设定为2 shl bx, cl ;将 BX 寄存器左移2位 add bx, ax ;将转换后的10进制数加到 BX 寄存器中 inc si ;指向下一个16进制数的地址 loop convert ;循环转换 mov dec, bx ;将转换后的10进制数存储在 dec 中 mov ah, 9h ;设置输出字符串功能号 mov dx, offset dec ;将要输出的字符串地址存储在 DX 中 int 21h ;输出转换后的10进制数 mov ah, 4ch ;设置程序结束功能号 int 21h ;结束程序 main endp end main ``` 以上代码使用循环指令和移位指令将16进制数转换为10进制数,并使用 INT 21H 中断输出结果。需要注意的是,在转换过程中需要判断字符是否大于等于'A',如果是则需要将其转换成对应的10~15。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值