8086CPU系统寻址方式和汇编语言程序设计

实验目的

(1)掌握8086CPU 系统的逻辑地址和寻址方式;
(2)掌握8086CPU系统中机器数的表示方式;
(3)掌握指令的机器码表示方法;
(4)掌握堆栈的概念和操作过程;
(5)掌握集成开发环境下程序设计和调试方法;
(6)掌握汇编语言实现具体算法的方式,区分汇编语言与高级语言的编程风格。

实验内容

  1. 进行汇编源程序的编辑、编译和链接操作,并完成调试内容,掌握汇编语言程序设计的基本方法和技巧。
    (1)源代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    CODE SEGMENT
    ASSUME CS:CODE
    START:MOV AX,8086H
    MOV BX,6800H
    MOV SI,8H
    MOV DS:[000BH],AX
    MOV ES:[6808H],SI
    ADD AX,SI
    MOV BX,[SI+3]
    MOV CX,ES:[BX+SI]
    PUSH CX
    MOV BX,0
    MOV CX,3[BX][SI]
    POP DX
    L1:JMP L1
    CODE ENDS
    END START

    (2)反汇编结果:
    X0-AI-VYZ-4-04-N2-WDMQ2-XC.png
    (3)运行结果
    PUSH后:
    3-A658-C-0-JFZOWEU55-O533-N.png
    POP后:
    RHH-Y-M-4-WS8-JWB-QP1-C8.png
    程序执行完毕结果:
    VR55-H13-FI-KJO-Z69-6.png
    K-BUZXOM-79-EJ-C-JCDJN8.png
  2. 内存中现有X和Y两个存储单元,分别存有42和-43,利用汇编语言编程计算这两个数之和,并将结果放入SUM存储单元。
    (1)源代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    DATA SEGMENT
    X DB 42
    Y DB -43
    SUM DB 0
    DATA ENDS
    CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
    START: MOV AX,DATA
    MOV DS,AX
    MOV AL,X
    ADD AL,Y
    MOV SUM,AL
    LOOP: JMP LOOP
    CODE ENDS
    END START

    (2)反汇编结果:
    4-FD26-1-V-E-TXCHKIJMG5.png
    (3)运行结果
    7-F-EIF4-PV-I2-C-T5-L4.png
    Z5-F9-MNGVE-L-HO-UWRE-17-L.png
    BZFXWNX-WD96657-D56-L-N-X.png
  3. 数据段中的一个存储单元X中存放的数据为10H,编程实现将该存储单元中的数据循环左移四位后存放到数据段的另一个存储单元Y中。
    (1)源代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    DATA SEGMENT
    X DB 10H
    Y DB ?
    DATA ENDS
    CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
    START: MOV AX,DATA
    MOV DS,AX
    MOV AL,X
    ROL AL,4
    MOV Y,AL
    LOOP: JMP LOOP
    CODE ENDS
    END START

    (2)反汇编:
    OWBUD-4-NL-UPIN5-HM-9.png
    (3)运行结果
    C-4-J-XLDTIXB-K814-H-RO.png
    S-F3-VNS7-LSDU8-T44-W2-GJ.png
    W6-GN0-IH1-S6-G-OPMNGV-U.png

实验中遇到的问题及分析

实验中遇到的问题;

在刚到机房时,虽然提前安装好了软件,但并没有运行测试,写完代码才发现无法调试和运行。后求助老师又经过一番排查,卸载后以管理员身份打开安装文件,再以管理员身份运行软件,即可调试或运行代码。
在第二题中,一开始使用ADD X Y命令发现无法编译通过,经过查询上课学的知识,得知ADD命令的目的操作数不能是立即数,改为MOV AL,X;ADD AL,Y后成功运行,

分析总结”实验报告要求”中的提问问题。

(1)总结在TPC-USB环境下汇编语言程序设计步骤和调试方法。
设计步骤:

  1. 分析题意,抽象出数据模型;
  2. 分析问题,确定算法;
  3. 根据算法设计流程框图;
  4. 分配存储空间和工作单元,合理地使用寄存器
  5. 根据框图编写程序
  6. 编译、调试、运行
    调试方法:
  7. 点击编译+链接按钮,系统自动判断代码中是否存在语法问题,如无问题则编译通过,进行下一步,如出现问题则根据报错信息定位错误位置,修改代码。
  8. 然后点击开始调试,进行代码的单步执行,每运行一步观察和记录运行后的结果、与前一步发生的变化等。
  9. 在调试的过程中可以选择设置断点,点击连续执行可直接跳至断点处。
    ①单步调试
    ②设置断点
    具体变化见上题
    总结:入栈出栈符合“后入先出”规则,每次入栈和出栈均以WORD为单位。
    入栈时执行PUSH指令,CPU自动修改指针SP-2→SP,使SP指向新栈顶;然后将低位数据压入(SP)单元,高位数据压入(SP+1)单元。
    出栈时执行POP指令,CPU先将当前栈顶SP(低位数据)和SP+1(高位数据)中的内容弹出,然后再自动修改指针,使SP+2→SP,SP指向新栈顶。
    ③反汇编
    X0-AI-VYZ-4-04-N2-WDMQ2-XC.png
    ④修改后变化过程
    AX: 0FE6H-1F96H-1F9EH
    BX: 8FEAH-1A90H-1F96H-0000H
    一个字须存放在2个相邻存储单元中,字数据的低位字节存储在低地址的存储单元中,高位字节存储在高地址的存储单元中,其字地址是两个存储单元中较低的一个。
    若字单元地址从偶地址开始,读写一个字只需访问一次存储器,若字单元地址从奇地址开始,读写一个字需访问两次存储器
    (3)按照编程设计实验的任务要求画出程序流程图、写出调试正确的源程序代码,并记录2中的调试内容。
    97-Y2-B6-RL4-C-B-IF-2-O-0-K.png
    BUZP-S3-AJ-HM-SGI-2-Q7-F.png
    (4)总结TPC-USB集成开发环境寄存器、内存、反汇编结果等的查看方法。
    寄存器查看方法:
    LW0-9-F-SL-39-LLX-K.png
    内存查看方法:
    67-VAG2-DJH79-WW4-ZQBXT215.png
    反汇编查看:
    0-E-1-U1-I0-UVKR0-V8-8-I-XPWR.png
    栈信息查看:
    4-G-X8-W2-WG1-OC-41-DEIYD.png
    变量信息查看:
    O60-CEO4-UJ-NS-L5-ZTPT0.png
    (5)采用哪一种寻址方式的指令执行速度最快?为什么?
    定长指令码格式,立即寻址最快,因为指令地址码即为操作数。
    变长指令码格式,寄存器寻址方式最快。因为立即寻址操作数可能很长,取指令时可能需要两次访存。而寄存器寻址由于寄存器数量不多,所以地址码位数不长,取指令只需一次访存,而寄存器取数速度非常快,所以寄存器寻址最快。