完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
8086 CPU 中寄存器总共为 14 个,且均为 16 位。 即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。 通用寄存器
BX (Base):基地址寄存器; CX (Count):计数器寄存器; DX (Data):数据寄存器;
BP (Base Pointer):基指针寄存器;
DI (Destination Index):目的变址寄存器; 控制寄存器: IP (Instruction Pointer):指令指针寄存器; FLAG:标志寄存器; 段寄存器: CS (Code Segment):代码段寄存器; DS (Data Segment):数据段寄存器; SS (Stack Segment):堆栈段寄存器; ES (Extra Segment):附加段寄存器; 下面对这些寄存器的作用和使用方式进行详细介绍。 数据寄存器(AX,BX,CX,DX) 数据寄存器有 AX,BX,CX,DX 四个组成,由于在 8086 之前的 CPU 为 8 位 CPU,所以为了兼容以前的 8 位程序,在 8086 CPU 中,每一个数据寄存器都可以当做两个单独的寄存器来使用,由此,每一个 16 位寄存器就可以当做 2 个独立的 8 位寄存器来使用了。 AX 寄存器可以分为两个独立的 8 位的 AH 和 AL 寄存器; BX 寄存器可以分为两个独立的 8 位的 BH 和 BL 寄存器; CX 寄存器可以分为两个独立的 8 位的 CH 和 CL 寄存器; DX 寄存器可以分为两个独立的 8 位的 DH 和 DL 寄存器; 除了上面 4 个数据寄存器以外,其他寄存器均不可以分为两个独立的 8 位寄存器 ;
MOV AX,1234H 向寄存器 AX 传入数据 1234H MOV AH,56H 向寄存器 AX 的高 8 位寄存器 AH 中传入数据 56H MOV AL,78H 向寄存器 AX 的低 8 位寄存器 AL 中传入数据 78H 既然 AX 又被称作为累加器,AX 寄存器还具有特殊的用途,其可以在使用 DIV 和 MUL 指令时使用
MOV DX,0H 设置 32 位被除数的高 16 位为 0H MOV AX,8H 设置 32 位被除数的低 16 位为 8H MOV BX,2H 设置 16 位除数为 2H DIV BX 执行计算 AX 寄存器在 MUL 指令中的使用: MOV AX,800H 设置 16 位乘数为 800H MOV BX,100H 设置 16 位乘数为 100H MOV DX,0H 清空用来保存乘法结果的高16 位 MUL BX 执行计算
BX 寄存器在寻址中的使用: MOV BX,5H MOV AH,[BX] 设置 AX 的值为偏移地址为 BX 的内存单元中的值(此时默认DS段)
CX 寄存器在循环中的使用(输出 5 个白底蓝字的 A): MOV AX,0B800H MOV DS,AX 使用 80x25 彩色字符模式,内存地址0xB8000 - 0xBFFFFF MOV BX,0 从 0xB8000 开始 MOV CX,5H 循环 5 次(每次运行到loop就减一) MOV DX,41H A的16 进制为 41H MOV AX,01110001B 显示白底蓝字 s: MOV [BX],DX 显示 ASCII 字符 ADD BX,1 MOV [BX],AX 设置字符显示属性 ADD BX,1 LOOP s
DX 寄存器在 DIV 指令中的使用(即 2293812 / 256 = 8960 余数为 52): MOV DX,0023H 32 位被除数的高 16 位 MOV AX,0034H 32 位被除数的低 16 位 MOV BX,100H 16的除数 DIV BX 指针寄存器(BP,SP)
BP也就是基指针寄存器,它和其他的几个用来进行寻址操作所使用的寄存器(还有 BX,SI,DI)没有太大的区别。首先,BP 寄存器作为通用寄存器的一种,说明其是可以暂存数据的,而后,BP 又不是数据寄存器,也就意味着其不能分割成 2 个独立的 8 位寄存器使用。 当以 […] 的方式访问内存单元而且在 […] 中使用了寄存器 BP 的话,如果在指令中没有明确或者说是显示的给出段地址时, 段地址使用默认的 SS 寄存器中的值(BX,SI,DI 会默认使用 DS 段寄存器)。比如 DS:[BP] 则在这里明确给出了段地址位于 DS 中,代表的内存单元即是段地址为 DS ,偏移量为 BP 寄存器中的值的内存单元;而如果是仅使用 [BP] 的话,则代表的内存单元是段地址为 SS,偏移量为 BP 寄存器中的值的内存单元。 在 8086 CPU 中,只有 4 个寄存器可以以 […] 的方式使用,这四个寄存器分别是 BX,SI,DI,BP。BX 寄存器在寻址中的使用: MOV BP,0 MOV AX,[BP] 将 SS:[BP] 代表的内存单元移入 AX 中 MOV AX,CS:[BP] 将 CS:[BP] 代表的内存单元移入 AX 中 变址寄存器(SI,DI) 首先,变址寄存器和上面介绍的指针寄存器(也就是 BP 和 SP),它们的功能其实都是用于存放某个存储单元地址的偏移,或者是用于某组存储单元开始地址的偏移,即作为存储器指针使用,当然,由于变址寄存器和指针寄存器都是属于通用寄存器,所以它们也可以保存算术结果或者说是具有暂存数据的功能,但是因为它们不是数据寄存器,所以无法分割成 2 个独立的 8 位寄存器使用。 SI 是源变址寄存器,DI 是目的变址寄存器,8086 CPU 中的 SI 寄存器和 DI 寄存器其实和 BX 寄存器的功能是差不多的,只不过 SI 寄存器和 DI 寄存器均不是数据寄存器,所以它们不能够拆分为 2 个独立的 8 位寄存器。同时,通过使用 SI 和 DI 寄存器也可以用来完成寻址操作。 MOV SI,0 初始化偏移地址为 0 MOV AX,[SI] 将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX中 MOV AX,DS:[SI] 将段地址为 DS 偏移地址为 SI 的内存单元中的值移入 AX 中 MOV AX,SS:[SI] 将段地址为 SS 偏移地址为 SI 的内存单元中的值移入 AX 中 其他寄存器(CS,IP,SS,SP,DS,ES) 由于段寄存器总是和其他一些像指针寄存器,变址寄存器,控制寄存器一起使用,所以在这里,不单独介绍段寄存器,而是将段寄存器和一些其他的常用寄存器搭配介绍。
标志寄存器(FLAG) 前面已经介绍了 8086 CPU 14个寄存器中的 13 个了,下面我们将介绍最后一个寄存器也就是 FLAG 寄存器。FLAG 中的每一个位都表示不同的状态,存储的信息通常又被称作程序状态字(PSW) 。下面是 FLAG 寄存器中各个位的示意图: Debug模式下的表示: |
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 02:24 , Processed in 1.243045 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号