8086汇编语言上机调试及基本操作

更新时间:2024-01-22 13:43:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课程编号

题目类型

得分 教师签名 批改日期

深 圳 大 学 实 验 报 告

课程名称: 微机原理实验

实验名称: 8086汇编语言上机调试及基本操作 学院: 物理科学与技术学院 组号: 指导教师: 李雄军 报告人:林成业 学号: 2012180073 实验地点: 科技楼302 实验时间:2014年9月24日实验报告提交时间: 2014年10月15日

一、实验目的:

(1)掌握常用DEBUG命令: G,D,R,T,U,Q。 (2)掌握工具软件EMU8086。

(3)掌握完整程序设计方法的格式,能正确书写数据段,代码段等。 (4)掌握简单的数值转换算法 二、实验原理 1.实验说明:

计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制之间的转换是一种基本功。

2.程序框图:对于0-999(即000H-3E7H)范围内的二进制数

3.参考程序:

; 将 AX中的三位数拆为三个BCD码, 并存入 Result 开始的三个单元 DATA SEGMENT ; 数据段 RESULT_1 DB 1 RESULT_2 DB 1 RESULT_3 DB 1 DATA ENDS

STACK SEGMENT STACK ; 堆栈段 STA DB 64 DUP(0) STACK_TOP DB 0 STACK ENDS

CODE SEGMENT ; 代码段

ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK

START:

MOV AX, DATA

MOV DS, AX ; 设置数据段 MOV AX, STACK

MOV SS, AX ; 设置堆栈段 LEA SP, STACK_TOP ; 设置栈顶指针

MOV AX, 2afH MOV CL, 100 DIV CL MOV RESULT_1, AL ; 除以 100, 得百位数 MOV AL, AH MOV AH, 0 MOV CL, 10 DIV CL MOV RESULT_2, AL ; 余数除以 10, 得十位数 MOV RESULT_3, AH ; 余数为个位数

MOV AX,4C00H ; 返回DOS INT 21H ; CODE ENDS END START ; 最后一行要按回车键

三、实验及报告要求:

1) 用合适的编辑软件编辑以上源文件并存入合适目录;要求补充注释未注释的

伪指令和指令;

2) 分别在DOS和Windows下编译、连接生成可执行文件,比较两个环

境下生成的机器码的长度和内容;试指出第2、5、7、10、14条指令的IP和机器码。

3) 分别在debug和emu8086下调试该可执行文件,给出程序运行时的各段

地址(CS=?,DS=?SS=?ES=?)举例说明debug的t,d,g,u等命令操作方法并对寄存器的变化作出解释;试改变被转换的三位数,并解释转换过程中标志寄存器中各标志位的结果;如何观察转换结果的变化? 4) 写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的

主要依据。

5) 实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法

和微机原理学习方法作出总结。 四、实验结果与分析

1.建立汇编源程序ASM文件。

DATA SEGMENT 数据段

RESULT_1 DB 1 结果1是低八位,初始量为’1’ RESULT_2 DB 1 结果1是低八位 RESULT_3 DB 1 结果1是低八位 DATA ENDS 结束数据段 STACK SEGMENT STACK 堆栈段

STA DB 64 DUP(0) 堆栈段初始化

STACK_TOP DB 0 栈顶初始化 STACK ENDS 结束堆栈段

CODE SEGMENT 代码段

ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START: 假定伪指令

MOV AX, DATA 把具体的DATA送至寄存器中 MOV DS, AX 设置数据段

MOV AX, STACK 把STACK送至寄存器中 MOV SS, AX 设置堆栈段 LEA SP, STACK_TOP 设置栈顶指针 MOV X, 2afh 把立即数2afh送至寄存器

MOV CL, 100 被除数为100 DIV CL 8位寄存器 MOV RESULT_1, AL 除以 100, 得百位数

MOV AL, AH 余数为下一个除数 MOV AH, 0 高8位清零

MOV CL, 10 被除数是10 DIV CL 8位寄存器

MOV RESULT_2, AL 余数除以 10, 得十位数 MOV RESULT_3, AH 余数是个位数 MOV AX,4C00H 返回DOS

INT 21H CODE ENDS 结束代码段

END START 最后一行按回车键

2.分别在DOS和Windows下编译、连接生成可执行文件,比较两个环境下生成的机器码的长度和内容;试指出第2、5、7、10、14条指令的IP和机器码。

(1)DOS

(2)Windows

(3)window和dos指令的IP和机器码比较 指令 2 5 7 10 14 DOS IP 0003 000A 0011 0018 0020 机器码 8ED8 8D264100 B164 8AC4 A20100 Windows IP 0003 000A 0010 0017 001F 机器码 8ED8 BC4000 B164 8AC4 A20100

3.分别在debug和emu8086下调试该可执行文件,给出程序运行时的各段地址(CS=?,DS=?SS=?ES=?)举例说明debug的t,d,g,u等命令操作方法并对寄存器的变化作出解释;试改变被转换的三位数,并解释转换过程中标志寄存器中各标志位的结果;如何观察转换结果的变化?

(1)debug和emu8086调试可执行文件的各段地址 Debug:

Emu8086:

debug和emu8086的段地址比较 段地址 CS DS SS ES debug 000A 076A 076B 075A Emu8086 0716 0700 0711 0700 (2)debug的t,d,g,u等命令操作的说明 T - 单步执行程序命令

用法: -T 要执行的指令条数 如:-T 1

U - 反汇编命令

用法: -U 代码段地址:起始偏移地址 如:-U CS:99

D - 显示内存中的数据命令

用法: -D 数据段地址:存放数据的偏移地址如:-D DS:01

G - 连续执行程序命令

用法: -G=代码段地址:指令的起始偏移地址指令的结束偏移地址 如: -G=CS:100 106

(3)试改变被转换的三位数,并解释转换过程中标志寄存器中各标志位的结果 将529H转换成123H 529H

123H

NV 无溢出 UP EI PL NZ NA PO NC 串操作指令为自动增量指令 允许中断请求 符号为正 运算结果不为零 辅助进位无进位 1的个数为奇数 无进位 五.实验总结

从本次上机实验,初步了解DOS和WINDOWS工具,学会了DOS.BOX和emu8086的使用,且在计算机上进行了一些简单数值进制转换。在编写源程时,要多注意各个段的格式,且要先确定流程图,才能一一对应的写出相应的代码。而在实验中,因没有及时在实验前了解DEBUG命令中U、D、G、R、T、Q等命令的具体含义,使得实验过程有点慢。但是在根据实验内容慢慢进行调试程序的过程中,经过在与同学的讨论之后,更加深刻地了解每一步每个代码有什么意义以及给出程序运行时的各段地址。 六、思考题

1.用单步执行命令t运行程序,运行到mov ax, 4c00h, int 21h指令后,cs和IP寄存器内容前后有何变化?产生变化的原因是什么?

CS由17F9变为00A7,IP由002A变为1165。处理器用CS寄存器和IP寄存器中得内容组成的逻辑地址取下一条要执行的指令。 2.试写出将BCD转换成二进制码的汇编程序。 DATA SEGMENT 定义数据段 RESULT_1 DB 1 为符号 RESULT_1保留一个字节

DATA ENDS 定义数据段结束

STACK SEGMENT STACK 定义堆栈段

STA DB 64 DUP(0) 将指针为64的字节数推入堆栈 STACK_TOP DB 0 设置栈顶指针为0 STACK ENDS 堆栈段定义结束

CODE SEGMENT 定义代码段

ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK 规定CS,DS,EX和SS的内容 START:

MOV AX, DATA DS初始化为DATA MOV DS, AX 设置数据段

MOV AX, STACK SS初始化为STACK MOV SS, AX 设置堆栈段 LEA SP, STACK_TOP 设置栈顶指针 BIN2BCD PROC PUSH AX PUSH BX PUSH CX PUSH DX

PUSH DI 现场保护

MOV CX,3 16位二进制码转换成压缩BCD码最多需要3个字节 RE:SUB DX,DX 清零

DIV WORD PTR 0AH AX除于10

MOV BL,DL 将余数保存,因为DL=DX SUB DX,DX DX清零 DIV WORD PTR 0AH

SHL DL,4 抬到高位 OR BL,DL 压缩BCD码 MOV [DI],BL 保存压缩BCD码 INC DI 准备保存下一个 DEC CX 计数 JNE RE 重复 POP DI POP DX POP CX POP BX POP AX RET

MOV AX,4C00H 返回DOS

INT 21H 目标指向21H

CODE ENDS 代码段结束 END START 最后一行要按回车

课程编号

题目类型

得分 教师签名 批改日期

深 圳 大 学 实 验 报 告

课程名称: 微机原理实验

实验名称: 二进制数到BCD码的转换

学院: 物理科学与技术学院

组号: 指导教师: 李雄军

报告人:林成业 学号: 2012180073

实验地点: 科技楼302 实验时间:2014年10月15日

实验报告提交时间: 2014年10月29日

一、实验要求:

将AX中的一个二进制数(对应的十进制数范围是0-65535),转换成压缩性BCD码表示的十进制,并从屏幕输出转换结果。要求用减法实现,并比较与除法方法进行运行速度比较。

二、实验目的:

(1)进一步熟练掌握8086汇编语言编译调试工具和环境的操作; (2)掌握完整8086汇编的程序设计编写方法; (3)掌握简单的数值码制转换方法;

(4)掌握键盘输出的DOS功能调用方法。 三、实验原理 1、实验说明:

计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制、码制之间的转换是一种基本功;利用DOS功能调用实现在屏幕上显示字符或数字的方法是本课程的基本要求之一。

2、提示:

实现以上转换有两种方法:1)除法;2)减法。即三位数先循环减1000,直到不够减了,做减法的次数就是百分位的结果;将不够减之前一次的余数恢复,再循环减去100,直到不够减了,做减法的次数就是十分位的结果;最后恢复的正余数就是个位的结果。以下是三位数的转换方法程序框图(供参考)

3、除法方法的参考程序:

; 将 AX中的三位数拆为三个BCD码, 并存入 Result 开始的叁个单元 DATA SEGMENT ; 数据段 RESULT_1 DB 0 RESULT_2 DB 0

RESULT_3 DB 0 ;定义三个字节变量,分别用来存放百分位、十分位和个位数 DATA ENDS

STACK SEGMENT STACK ; 堆栈段

STA DB 64 DUP(0); 开辟100单元作为堆栈空间 STACK_TOP DB 0 STACK ENDS

CODE SEGMENT ; 代码段

ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START:

MOV AX, DATA

MOV DS, AX ; 设置数据段 MOV AX, STACK

MOV SS, AX ; 设置堆栈段 LEA SP, STACK_TOP ; 设置栈顶指针

MOV AX, 123 ; 被转换的数先放入AX中 MOV CL, 100 DIV CL MOV RESULT_1, AL ; 除以 100, 得百位数 MOV AL, AH MOV AH, 0 MOV CL, 10 DIV CL

MOV RESULT_2, AL ; 余数除以 10, 得十位数,存入RESULT_2 MOV RESULT_3, AH ; 余数为个位数,存入RESULT_3

MOV AX,4C00H ; 返回DOS(两句) INT 21H ; CODE ENDS END START ; 最后一行要按回车键 4.补充提示:

1)屏幕显示字符的方法(DOS功能调用2,参考课本P131)

MOV AH, 02 ; 送显示功能号到AH

MOV DL, ‘1’ ; 被显示字符的ASCII码’1’送DL INT 21H ; DOS INT 21 功能调用 2)空格、回车、换行的ASCII码分别是 20H, 0DH,0AH 3)跳转、循环语句 LOOP NEXT的使用举例:

若要用减法求AL中的内容为5的多少倍,核心代码如下: MOV CL, 0; 计数器清零 NEXT: SUB AL, 5; 减5 JC OVER; 有借位说明不够减 INC CL ; 否则够减,计数器加1 JMP NEXT; 无条件跳转 OVER: ADD AL,5; 最后恢复不够减时AL的余数 ;至此, CL中就是所求结果(即AL内容的5的倍数) 四、实验及报告要求:

1.简要说明算法,并画出正确的程序流程图;

2.给出完整正确的源程序代码,要求给每一句伪指令或指令加上注释;

3.分别在DOS和Windows下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。 4.如何观察转换过程中标志寄存器中各标志位的结果?如何观察转换结果的变化?试改变被转换数值,对结果与编制为的变化加以说明和解释。

5.写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。

6.实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法和微机原理学习方法作出总结。 五、思考题:

如何让你的程序自适应地处理高位为‘0’时不输出或输出空格呢?

本文来源:https://www.bwwdw.com/article/8qgo.html

Top