【微机原理作业】8086的寄存器和汇编程序的编译过程

一.内容摘要

1、 利用 Proteus 和 emu8086 学习寄存器的相关知识

2、 利用 emu8086 简单程序编译仿真过程学习汇编程序与机器码的对应过程,掌握编译完成后的代码的存储原理

二.8086寄存器

8086微处理器的结构:
8086微处理器的结构

1.数据寄存器

8086CPU的指令执行部件EU有4个16位的寄存器:AX、BX、CX、DX,8个8位的寄存器:AH、AL、BH、BL、CH、CL、DH、DL。

寄存器名称作用
AX(累加器)存放参与运算的数据和结果
BX(基址寄存器)可以作为数据寄存器,也可以存放内存的逻辑偏移地址
CX(数据寄存器)可以作为数据寄存器,也可以在串指令和移位指令中计数
DX(数据寄存器)可以作为数据寄存器,也可以用在乘、除法运算、带符号数的拓展

2.指针和变址寄存器

8086CPU的EU中有2个地址指针寄存器SP、BP和2个变址寄存器SI、DI。

寄存器名称作用
SP(堆栈指针寄存器)保存栈顶的偏移地址(隐含的逻辑段地址在堆栈段寄存器中)
BP(基址指针寄存器)保存内存的偏移地址(隐含的逻辑段地址在堆栈段寄存器中)
SI(源变址寄存器)保存内存的偏移地址(隐含的逻辑段地址在数据段寄存器中),也可以存放数据
DI(目的变址寄存器)保存内存的偏移地址(隐含的逻辑段地址在数据段寄存器中),也可以存放数据

3.段寄存器

8086CPU的总线接口部件(BIU)中有4个16位段寄存器。

寄存器名称作用
CS(代码段寄存器)存放程序代码段起始地址的高16位
DS(数据段寄存器)存放数据段起始地址的高16位
SS(堆栈段寄存器)存放堆栈段起始地址的高16位
ES(拓展段段寄存器)存放拓展数据段起始地址的高16位

4.指令指针寄存器

指令指针寄存器IP存放当前代码段中的偏移地址,它与CS联用,可以形成下一条要取出指令的物理地址。

5.标志寄存器

8086CPU有一个16位标志寄存器(FR),规定了9个标志位,包括6个状态标志(CF、PF、AF、ZF、SF和OF)和3个控制标志(IF、DF和TF)。

  • CF:进位标志位
  • PF:奇偶标志位
  • AF:辅助进位标志位
  • ZF:零标志位
  • SF:符号标志位
  • OF:溢出标志位
  • IF:中断允许标志位
  • DF:方向标志位
  • OF:溢出标志位

三.emu8086编译仿真过程

1.运行过程

打开emu8086软件,新建一个asm文件,输入汇编程序。

下面以从1到100,100个数求和的程序作为例子,展示编译仿真的过程。

汇编程序:

; 
;*****************************************************************************
; @file       add.asm
; @author     Xiaoxiao
; @date       2020-9-23
; @brief      100个数求和(1+2+3+...+100)   
; @blog       https://blog.csdn.net/weixin_43470383/article/details/108625782
;*****************************************************************************
;

DATA SEGMENT
    total DW 0000H
ENDS

STACK SEGMENT
    dw   128  dup(0)
ENDS

CODE SEGMENT    
    ASSUME CS:CODE, DS:DATA
START:

    mov AX, DATA
    mov DS, AX
    mov ES, AX

    MOV CX, 100
    MOV AX, 0
    MOV BX, 1
    
add_100:
    ADD AX, BX
    INC BX
    LOOP add_100
    
    MOV TOTAL, AX
    JMP $   
ENDS

END START

emu8086界面
点击 emulate(绿色小箭头),开始仿真,这时会弹出两个窗口:

emulator
右边的蓝色区域为汇编原码,左边的蓝色区域为汇编原码编译形成的机器码

origin source code
第一个窗口中的蓝色区域和第二个窗口中黄色区域是对应的。
load:加载文件。
reload:重新运行代码。
single step:单步运行程序,可以查看每一步运行的结果。
step back:返回上一步运行结果。
run:运行程序,直到结束。

emulator
程序完整运行结果:

emulator
source code
可以看到程序终止于 JMP $,这条指令的意思程序停在这个位置,等待中断。

2.运行过程分析

(1)数据寄存器

在机器码的左边可以看到8086的寄存器
registers上面的程序把1+2+…+100的和存入寄存器AX,BX用来存放加数(1、2…100),CX用来存放计数值,一共100个数相加,所以是100D(64H)。

当执行完 MOV CX, 100 时,CX寄存器变成 00 64(100D = 64H);执行完 MOV AX, 0 时,AX寄存器变成00 00;执行完 MOV BX, 1 时,BX寄存器变成 00 01

继续运行,循环 add_100 共100次,每一次循环把BX的值加到AX上,然后BX加1,下一次 LOOP 循环的时候CX自动减1。

最终运行结果:AX变成 13 BA (5050D = 13BAH),BX变成 00 65(101D = 65H),CX变成 00 00

(2)段寄存器

汇编程序中用
段名 SEGEMNT

段名 ENDS

来完成段的定义,用
ASSUME 段寄存器名:段名[, …]
来将某段分配给指定段寄存器

例如:

ASSUME CS:CODE, DS:DATA

即为段假设

mov AX, DATA
mov DS, AX
mov ES, AX

即为给除CS以外的其他用到的段的段寄存器赋值
运行结果:

段寄存器

(3)指令指针寄存器

CS:IP 两个寄存器共同指示了 CPU 当前将要读取的指令的地址。
单步执行指令,CPU 就要将偏移地址向下移动,IP地址将发生改变。

(4)标志寄存器

在 view -> flags 中可以查看标志寄存器

在这里插入图片描述

四.emu8086编译完成后的代码的存储

在 view -> memory 中可以查看代码存储
memory
由于程序起始地址为 0710 : 0000 ,所以将地址改一下,然后update 或者按 enter 键,就可以看到程序运行的存储结果了

memory

五.proteus中查看8086寄存器

将emu8086编译生成的 exe/com/bin 文件,输入到proteus的8086CPU,点击运行,然后在 调试 > 8086 > Registers 中可以查看8086的寄存器。
在这里插入图片描述
在这里插入图片描述

参考:《微机原理与接口技术》(第4版)电子工业出版社

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不雨_亦潇潇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值