微机课程设计报告

课程设计报告

( 2013—20xx年度第一学期)

名 称: 题 目:院 系: 控计学院 设计周数: 1周 成 绩:

日期:20xx年1月3

微机课程设计报告

课程 课程设计(综合实验)报告

一、课程设计的目的与要求

目的:在微机原理及应用课程中分别学过了微机原理各个基本组成模块的原理和编程技术的基础上,

综合应用各部分知识,在实验室现有设备的情况下,设计一个具有一定功能的应用系统,达到对各部分知识加深理解、融会贯通的目的,并进一步锻炼学生的动手能力和综合分析能力,同时培养学生的团队精神。要求每个同学独立完成自己分担的部分,整体方案可以组内同学讨论确定。

要求:能完成六位十进制数的加、减、乘、除运算以及平方运算,操作过程与普通计算器相同,即先

输入一个操作数,然后按下“+”“—”“×”“÷”键,再输入下一个操作数,按等号键开始运算并显示结果,若结果超过六位,则显示“E”。

要求尽量与真实计算器相似。

任务:我负责的是软件整体构建,和对加法,减法,乘法,除法,平方,清零以及带小数运算程序的

编写和调试。

二、设计正文

将可编程外围接口芯片8255A 与键盘和七段LED 连接,通过对8255A 编程及对键盘的操作实现计算功能。键盘码包括数字0~9、运算符号“+” “-” “*” “/”“=”和清零“CL”键。

首先利用程序不断扫描件键盘是否有输入,如果没有就一直扫描,如果有就停止扫描,完成输入。通过键盘依次输入第一个运算数字、运算符号、第二个运算数字、“=”,在七段LED 灯上显示运算结果,期间数字输入有误可按“C”键之后重新输入。

三、课程设计总结

1. 本次课程设计选择了简易计算器设计的题目,不仅使我加深了对接口程序设计的认识,对可编程

并行I/O接口芯片8255的工作原理也有了进一步的了解,更重要的是培养了我们发现问题,解决问题的能力。

2. 根据微机原理课程所学相关知识及实验教程相关内容,在基于proteus平台,使用汇编语言,以

8086为核心的情况下,配合可编程并行接口器件8255A,LED数码管等器件实现可进行简单六位数加减乘除法及清零扩展功能的十进制计算器。在课程设计实践中,我们不仅锻炼了实际动手能力,培养了团队精神和严肃认真的工作态度,更增强了自己在实际的工程设计中查阅资料,撰写设计报告表达设计思想和结果的能力。

3. 在编程过程中,需要很多细节的注意和推敲。本来很简单的想法,到了实际的编程过程中,就发

现并不是那么简单。如减法的每次循环过程中的借位,时时刻刻都得注意,稍不留神就可能出错。编程不仅使我们对微机有了更深的理解,也教会了我们不要眼高手低,得脚踏实地,帮我们养成了严谨的思想。还有,本次课设中有各种新的知识不在课本中,就需要我们去查阅资料,上网搜索之类。在这个过程中,不仅仅是反映在这几页报告中的知识,更多的也有如protues的作图,仿真过程中的各类问题的解决方法;以及键盘的各类知识。有些东西,我们天天接触,但要是让我们亲自做一下的时候,可能就会暴露出我们更多的问题。很感谢能有这样的机会去用已有的知识做一些我们力所能及的事。

四、参考文献

[1]《清华大学TPC-2003A实验指导书》,2006版

1

课程 课程设计(综合实验)报告

微机课程设计报告

[2] 李继灿,《新编16/32位微型计算机原理及应用》,清华大学出版社,第四版,20xx年 [3] 杨国田,高明明 《微机原理实验指导书》 校内待出版,第一版,20xx年3月 附录

1.

课程 课程设计(综合实验)报告

2.硬件设计概要:

2.1. LED 显示的功能及实现

七段 LED 显示器由七个发光段构成,每段均是一个LED 二极管。这七个发光段分别称为a,b,c,d,e,f,g,通过控制不同段的点亮和熄灭,以显示所要得到的数字。七段LED 的输出功能也是通过8255的并行输出实现。 LED 显示数字编码表

0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0FFH,0FFH,0FFH,0FFH,86H,0BFH

微机课程设计报告

3

课程 课程设计(综合实验)报告 2.2、8255工作原理

2.2.1.8255 引脚功能说明:

D0~D7:数据线,三态双向数8位缓冲器,8255 与CPU 数据传送的通道,当

CPU 执行输入输出指令时,通过它实现8 位数据的读/写操作,控制字和状

态信息也通过数据总线传送。

A0~A1:地址线,用于选择端口,即用其来选择A口、B口、C口或寄存器控

制口。

RD(低电平有效):读信号线,当这个输入引脚为低电平时,允许8255 通

过数据总线向CPU 发送数据或状态信息,即CPU 从8255 读取信息或数据。

WR(低电平有效):写入信号,当这个输入引脚为低电平时,允许CPU 将数

据或控制字写8255。

CS(低电平有效):片选信号线,当这个输入引脚为低电平时,表示芯片被

选中,允许8255 与CPU 进行通讯。

RESET(高电平有效):复位输入线,当该输入端外于高电平时,所有内部

寄存器(包括控制寄存器)均被清除,所有I/O 口均被置成输入方式。

PA0~PA7:端口A 输入输出线,8位数据输入锁存器和8位数据输出锁存器/

缓冲器。

PB0~PB7:端口B 输入输出线,8位数据输入缓冲器和8位数据输出锁存器/

缓冲器

PC0~PC7:端口C 输入输出线,端口B 输入输出线,8位数据输入缓冲器和8位数据输出锁存器/缓冲器 实际使用时,可以把A口、B口、C口分成两个控制组,即A组和B组。A组控制电路由端口A和端口C的高4位(PC4~PC7)组成,B组控制电路由端口B和端口才的低4位(PC0~PC3)组成。

2.2.2.8255 的读写控制:

8255 的读/写控制逻辑电路接受CPU 发来的控制口号RD、WR、RESET 和地址信号A1~A0。然后根据命令端口,控制信号的要求,将端口的数据读出选信CPU 或者将CPU送来的数据写入端口,各端口的工作状态。通过用输出指令对8255A 的控制字寄存器编程,写入设定工作方式的控制字,可以让3个数据口以不同的方式工作,端口A 可工作于3 种方式的任一种,端口B 只能工作于方式0 和方式1,端口C 除了用于输入输出端口外,还能配合A 口和B 口工作,为这两个端口的输入输出操作提供联系信号。

2.2.3.数据总线缓冲器

它是一个双向三态的8位数据缓冲器,8255A正是通过它与系统数据总线相连,用于输入/输出数据以及传送由CPU发给8255A的控制字

2.2.4.定义工作方式控制字

微机课程设计报告

4

课程 课程设计(综合实验)报告 工作方式0:8255A中各端口的基本输入/输出方式。

2.3 微处理器8086芯片 当引脚接高电平时,CPU工作于最小方式(单处理器系统方式,适合于较小规模的应用)。此时,引脚功能如下:

(1)AD

微机课程设计报告

15

微机课程设计报告

~AD0:分时复用的存储器或端口的地址和数据总线。传送地址时为单向的三态输出,而传送数据时为双向三态输入/输出。

(2)IO/M存储器/输入、输出控制信号(输出、三态):它用于区分CPU当前是访问存储器还是访问输入/输出端口。高电表示访问存储器,说明当前要进行CPU与存储器之间的数据传送。低电平表示访问输入/输出设备。表示当前要进行CPU与I/O端口之间的数据传送。在DMA时,它被置为浮空。

(3)WR/LOCK(输出,低电平有效,三态): 信号

有效,即为低电平时,表示CPU正在执行存储器或I/O

写操作,在写周期中,WR在T2、T2、Tw期间都有

效。在DMA时,WR被置为浮空。

(4)INTA:可屏蔽中断响应信号,输出,低电平有

效。 CPU通过信号对外设提出的可屏蔽中断请求做出

响应。为低电平时,表示CPU已经响应外设的中断请求,

即将执行中断服务程序。

(5)ALE:地址锁存允许信号,输出,高电平有效。

CPU利用ALE信号可以把AD15 ~AD0地址/数据、

A19/S6~A16/S3地址/状态线上的地址信息锁存在地

址锁存器中。

(5)DT:数据发送/接收信号,输出,三态。 DT/信号用来控制数据传送的方向。DT/为高电平时,

5

课程 课程设计(综合实验)报告 CPU发送数据到存储器或I/O端口;DT/为低电平时,

微机课程设计报告

CPU接收来自存储器或I/O端口的数据。

(6)DEN:数据允许控制信号,输出,三态,低电平有效。信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。

(7)HOLD:总线保持请求信号,输入,高电平有效。在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。 (8)HLDA:总线保持响应信号,输出,高电平有效。HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。

(9)RD:读控制信号,三态,输出。当RD=0时,表示CPU执行存储器或I/O端口的读操作。是对内存单元还是对I/O端口读取数据,取决于M/IO信号。在执行DMA操作时,RD被浮空。

(10)READY:“准备好”信号线,输入。该引脚接受被寻址的内存或I/O端口发给CPU的响应信号,高电平时表示内存或I/O端口已准备就绪,CPU可以进行数据传输。CPU在T3状态开始对READY信号采样。若检测到READY为低电平,表示内存或 I/O端口尚未准备就绪,则CPU在T3状态之后自动插入等待状态Tw,直到READY信号变为高电平,内存或I/O端口已准备就绪,CPU才可以进行数据传输。

2.4、74LS273锁存器

D0~D7:出入;

Q0~Q7:输出;

第一脚WR:主清除端,低电平触发,即当为低电平时,芯片被清除,输出全为0(低电平);

CP(CLK):触发端,上升沿触发,即当CP从低到高电平时,D0~D7的数据通过芯片,为0时将数据锁存,D0~D7的数据不变。

6

课程 课程设计(综合实验)报告

微机课程设计报告

3.键盘输入输出模块:

键盘是常用信息输入元件,由一个个按钮组成。

下图是一个4*4键盘结构图,将4*4键盘的八个管脚接8255的PC口,因为进行键盘扫描一般要求有一部分的I/O口工作方式是输入,另一部分I/O是输出,具体到4*4键盘则要求四个I/O口输入,另外四个输出。行信息连C口低四位,列信息连A口低四位。

微机课程设计报告

当进行扫描时,扫描信号由列引脚输入键盘。以0111、1011、1101 和1110 的顺序每次扫描不同的列,然后读取列引脚的信号就可以判断是哪个键被按下。识别键盘上哪个键被压下的过程的扫描步骤:

1.检测是否所有键都都松开了,若没有则反复检测。

2.但所有键都松开了,再检测是否有键压下,若无键一下则反复检测。

3.如有键压下,要消除键抖动,确认有键压下。

4.对压下的键进行编码,将该键的行列信号转换成16 进制码,由此确定哪个键被压下了。如出现多键重按的情况,只有在其它键均释放后,仅剩一个键闭合时,才把此键当作本次压下的键。

5.该键释放后,再回到2

7

课程 课程设计(综合实验)报告 4.总原理图

微机课程设计报告

3软件设计特点(主要任务):

首先设计程序用到的代码段,数据段,堆栈段。根据题目要求,我设计10位内存存储运算结果,减小了计算溢出的可能性。为程序设计初始化主程序,保证程序运行时避免出错。同时在每个子程序操作时将一些重要寄存器ax,dx等压入堆栈,防止不必要的错误。对于加减法我通过进位或借位标志进行控制。对于乘法,我先将内存的数据转换成16进制(乘0ah),并且记录乘数的大小,用于被乘数的累加运算。我之所以没在乘法中使用16进制的乘法指令是为了防止有一个数超过65536的情况发生,减小错误的几率,并且为我的程序增加了适用范围以及容错性。对于除法,直接循环利用被除数减去除数即可,利用借位标志退出机制。

在完成加减乘除基本功能的程序后,我又增添了后续的小数功能,将小数与这4个子程序巧妙的联合起来,其中除了除法的功能弱一点,其他都相对完善。同时我也添加了连续运算的功能,虽然并不能分清优先级别,但是对于简单计算机的性能已有很大的改善。附图如下:

8

课程 课程设计(综合实验)报告

微机课程设计报告

9

微机课程设计报告

课程 课程设计(综合实验)报告

微机课程设计报告

程序

CLEAR MACRO

push dx

push cx

push bx

push ax

mov ah,6

mov al,0

mov bh,01h

mov cx,0

mov dx,184fh

int 10h

pop dx

pop cx

pop bx

10

课程 课程设计(综合实验)报告 pop ax

ENDM

data segment

shuf dw 0 ;当前数标志符 yunf dw 0 ;运算符标志符 fssf dw 0 ;小数点标志符 finf dw 0 ;完成符标识符 fsf0 dw 0 ;小数1个数标志符 fsf1 dw 0 ;小数2个数标志符 fsf dw 0 numb0f db 0 ;NUMB0清空标志 numb1f db 0 ;NUMB1清空标志 numb0 db 10 dup(0) ;第一个运算数 numb1 db 10 dup(0) ;第二个运算数 numb2 db 10 dup(0) ;第三个运算数 numb3 db 10dup(0) ;小数 fkey db "error重新输入...$"

data ends

stack segment stack

db 100 dup(0)

stack ends

code segment

assume ds:data,,ss:stack,cs:code

start:mov ax, data

mov ds, ax

;---------------------------------------------------------------------------------------- ;各变量初始清0

mov si,0 ;清空两个运算数

11

课程 课程设计(综合实验)报告

mov cx,10 mov numb0,0 mov numb1,0

ini:mov numb0[si],0

mov numb1[si],0 mov numb2[si],0

inc si

loop ini mov shuf,0 mov yunf,0 mov finf,0 ;当前数置0,表示指向第一个数 ;运算符置0,表示没有运算符 ;完成符置0,表示没有完成 mov fssf,0 ;置小数点符0,表示没有小数点 mov fsf0,0 ;置小数个数符0,表示没有小数部分 mov fsf1,0 mov fsf,0 mov numb0f,1 mov numb1f,1 ;第一个数清空标志置1,表示第一个数被清空 ;第二个数清空标志置1,表示第二个数被清空

;-----------------------------------------------------------------------------------------

;--------------------------------------------------------------------------------------- ru:

mov ah,1

int 21h

push ax

cmp al,'.' ;跳转小数部分

jz fskey

cmp al,'+' jz addkey ;跳转至加法键部分 cmp al,'-'

12

课程 课程设计(综合实验)报告

jz subkey ;跳转至减法键部分 cmp al,'*' jz mulkey ;跳转至乘法键部分 cmp al,'/' jz divkey ;跳转至除法键部分 cmp al,'c' jz clrkey ;跳转至清除键部分 cmp al,'9' jbe numkey ;跳转至数字键部分 jmp equkey

;------------------------------------------------------------------------------------- ;数字键部分

numkey:

sub al,30h

save_numb1:cmp yunf,0

mov si,9 jz save_numb0 ;若没有运算符号则将输入数存入NUMB0 mov shuf,1 ;当前符值1,指向第二个数 cmp numb1[si],0 ;若最高位为空,则标志当先数没有存满六位,继续存入 jnz ru ;否则直接返回输入 cmp numb1f,1 jz place1 ;参与运算的小数的总数 mov cx,10 ;逐位前移

13 ;若数当前被清空过,则直接将输入数存入最低位

课程 课程设计(综合实验)报告

mov si,0 cmp fssf,1 jz xsd1

adjust1:

xchg al,numb1[si] inc si loop adjust1 mov numb1f,0 jmp ru ;将NUMB1F置0,表示第二个数没有清零

place1:mov numb1[0],al

save_numb0:mov shuf,0

cmp finf,0 mov numb1f,0 jmp ru ;若完成符为1,表示完成过一次运算,则清空NUMBO jz save_next mov si,1 mov cx,9 mov numb0,0 ;清空NUMB0

save_ini:mov numb0[si],0

inc si loop save_ini mov numb0f,1 mov finf,0

save_next:mov si,9 ;

cmp numb0[si],0 jnz ru cmp numb0f,1 jz place0 mov cx,10

14

课程 课程设计(综合实验)报告

mov si,0 cmp fssf,1 jz xsd0

adjust0:

xchg al,numb0[si] inc si loop adjust0 mov numb0f,0 jmp ru

place0:mov numb0f,0

mov numb0[0],al

jmp ru

xsd1:

add fsf1,1

jmp adjust1

xsd0:

add fsf0,1

jmp adjust0

;小数点部分

fskey:

mov fssf,1

jmp ru

;等号键部分

equkey:

call calp

mov finf,1 ;按下等号则调用CALP运算子程序,

mov yunf,0 ;运算后清空运算符 ;置完成符

15

课程 课程设计(综合实验)报告

jmp ru

;-------------------------------------------------------------------------------------- ;运算符号键部分

addkey: pop ax

mov fssf,0

cmp yunf,0

jz placef

call calp

jmp placef

subkey:pop ax

mov fssf,0

cmp yunf,0

jz placef

call calp

jmp placef

mulkey: pop ax

mov fssf,0

cmp yunf,0

jz placef

call calp

jmp placef

divkey: pop ax

mov fssf,0

cmp yunf,0

jz placef

call calp ;若之前没有过运算符,则置运算符 ;若之前有过运算符,则调用CALP进行运算 ;运算结束后置当前运算符

16

课程 课程设计(综合实验)报告 jmp placef

placef:

cmp al,'+'

jz addf

cmp al,'-'

jz subf

cmp al,'*'

jz mulf

cmp al,'/'

jz divf

cmp al,'c'

jz clrkey

addf:mov yunf,1

jmp ru ;置运算符完毕后返回输入 subf:mov yunf,2

jmp ru

mulf:mov yunf,3

jmp ru

divf:mov yunf ,4

jmp ru

clrkey:clear

mov bh,0

mov dh,0

mov dl,0

mov ah,2

int 10h

17

课程 课程设计(综合实验)报告 jmp start ;按下clear键后跳转至开头,全部清零

;--------------------------------------------------------------------------------------- ;运算子程序CALP

calp proc

cmp yunf,0 ;若运算符为0,则直接转输入 jz yunf_over ;否则跳转至结束处ret cmp yunf,1 ;根据运算符调用运算子程序 jz addcal cmp yunf,2 jz subcal cmp yunf,3 jz mulcal cmp yunf,4 jz divcal

addcal:call addp

jmp yunf_over ;调用相应计算子程序

subcal:call subp

jmp yunf_over

mulcal:call mulp

jmp yunf_over

divcal:call divp

yunf_over:ret

calp endp

;----------------------------------------------------------------------------------------- ;加法子程序 (带小数)

addp proc

push ax

push dx

clc

18

课程 课程设计(综合实验)报告

mov dx ,fsf0 mov bx,fsf1 cmp dx,bx jnz tiaozh cmp dx,0 jz huizh1 mov fsf,dx ;清除进位标志

huizh1: mov cx,10

mov si,0

addnext_bit:mov al,numb0[si]

adc al,numb1[si] aaa mov numb0[si],al inc si loop addnext_bit jc start mov numb1f,1 jmp xs

addp endp

;----------------------------------------------------------------------------------------- ;减法子程序 (带小数)

subp proc

push ax

push dx

clc ;清除进位标志 mov dx ,fsf0 mov bx,fsf1 cmp dx,bx jnz tiaozh cmp dx,0

19

课程 课程设计(综合实验)报告

jz huizh2 mov fsf,dx

huizh2: mov cx,10

mov si,0 ;清除借位标志

subnext_bit:mov al,numb0[si]

sbb al,numb1[si] aas mov numb0[si],al inc si loop subnext_bit jc start mov numb1f,1 jmp xs

subp endp

;乘法子程序 (带小数)

mulp proc

;把bcd码转化成16进制数,供循环使用 push ax

push dx

mov di,0 ;存次数的低位 mov bp,0 ;存次数的高位 mov ax,0

mov cx,10

mov si,0

mov dx,fsf0

add dx,fsf1

mov fsf,dx

xunjian0: ;排除有一个数为0的情况 cmp numb0[si],0

jz jj0

20

课程 课程设计(综合实验)报告 jnz xia

jj0: inc si

loop xunjian0

cmp si,10

jz xs0

xia:

mov cx,10

mov si,0

xunjian1:

cmp numb1[si],0

jz jj1

jnz jx

jj1:inc si

loop xunjian1

cmp si,10

jz xs1

jx:

mov al,numb1

add di,ax

mov ax,0

mov al,numb1[1]

mov bx,10

mul bx

add di,ax

mov ax,0

mov al,numb1[2]

mov bx,100

mul bx

add di,ax

mov ax,0

mov al,numb1[3]

21

课程 课程设计(综合实验)报告 mov bx,1000

mul bx

add di,ax

mov ax,0

mov al,numb1[4]

mov bx,10000

mul bx

add di,ax

adc bp,dx

mov bx,100

mov ax,0

mov al,numb1[5]

mul bx

mov bx,1000

mul bx

add di,ax

adc bp,dx ;现在次数存在bp和di中 ;numb1个numb0相加 ;先把零头加了

mov cx,di ;低位零头存在di中 cmp cx,1

jz display ;若为1倍,则不加直接跳出 sub cx,1 ;加倍数减一次

push cx

;将numb0的内容复制到numb2中

mov cx,10

mov si,0

beifen:mov al,numb0[si]

mov numb2[si],al

inc si loop beifen

22

课程 课程设计(综合实验)报告 pop cx

;复制结束

;下面进行连加,另增加一段numb2的内存是为了解决由于adc与aaa必须连用,且aaa只能对al进行操作的问题

extra:

push cx

mov si,0

mov cx,10

clc

in_adc1:mov al,numb2[si]

adc al,numb0[si]

aaa

mov numb2[si],al

inc si

loop in_adc1

jc yichu ;

pop cx

loop extra

;高位部分

main:cmp bp,0

jz outside

;mov si,0 ;

;mov cx,6

;clc

;in_adc2:mov al,numb0[si]

;adc al,al

;aaa

;mov numb0[si],al

;inc si 溢出则跳出 由于是10000h个数相加,即加0ffff次

23

课程 课程设计(综合实验)报告 ;loop in_adc2

;jc begin ;溢出则跳出

mov cx,0ffffh ;剩下的0ffffh遍

extra1:push cx

mov si,0

mov cx,10

clc

in_adc3:mov al,numb2[si]

adc al,numb0[si]

aaa

mov numb2[si],al

inc si

loop in_adc3

;jc begin ;溢出则跳出

pop cx

loop extra1

dec bp

jmp main

outside:

mov cx,10

mov si,0

fuzhi:

mov dl,numb2[si]

mov numb0[si],dl

inc si

loop fuzhi

mov numb1f,1

jmp xs

mulp endp

;-----------------------------------------------------------------------------------------

24

课程 课程设计(综合实验)报告 ;除法子程序 (带小数)

divp proc

push ax

push dx

mov si,0FFH mov cx,10 mov dx,fsf0 ;判断除数是否为0

cmp dx,fsf1

jnz tiaozh_0

check_0:inc si

mov si,0 mov cx,10 ;清除除法结果 cmp si,10 jz start ;若6位皆为0则溢出清零 cmp numb1[si],0 jz check_0

clrres: mov numb2[si],0

inc si loop clrres

divsub:mov si,0

mov cx,10 clc ;清除借位标志

subnext:

mov al,numb0[si]

sbb al,numb1[si] aas mov numb0[si],al inc si loop subnext jc div_over

25

课程 课程设计(综合实验)报告 ;每减一次则结果加1 clc

mov si,0

mov cx,9

mov al,numb2[si]

adc al,1

aaa

mov numb2[si],al

divres:inc si

mov al,numb2[si]

adc al,0

aaa

mov numb2[si],al

loop divres

jmp divsub

div_over:

mov cx,10

mov si,0

fuzhi1:

mov dl,numb2[si]

mov numb0[si],dl

inc si

loop fuzhi1

mov numb1f,1

jmp xs

divp endp

xs: ;

pop dx

pop ax

cmp al,'=' 显示判断连续运算

26

课程 课程设计(综合实验)报告

je display mov dx,fsf mov fsf0,dx ;为小数点个数寄存器清零 mov fsf1,0

mov fssf,0

mov cx,10

mov si,0

inii:mov numb1[si],0

inc si

loop inii

cmp al,'+'

jz addf

cmp al,'-'

jz subf

cmp al,'*'

jz mulf

cmp al,'/'

jz divf

cmp al,'c'

jz clrkey

display: push ax

push dx

mov si,9

retrans:

cmp numb0[si],0

jz rechange0

jmp next

next: mov ax,0b800h

mov es,ax

27

课程 课程设计(综合实验)报告 mov si,9

mov di,28

mov cx,10

mov dh,2

dec fsf

mov bx,fsf

a: cmp si,fsf ;显示小数点

jz xsxs

mov dl,numb0[si]

add dl,30h

mov es:[di],dx

dec si

add di,2

loop a

jmp start

yichu:

lea dx, fkey

mov ah, 9

int 21h ; output string at ds:dx jmp clrkey

xs0: ;xs0,xs1这2段显示特殊的情形 push ax

push dx

mov ax,0b800h

mov es,ax

mov si,9

mov di,28

mov cx,10

mov dh,2

l:

mov dl,numb0[si]

28

课程 课程设计(综合实验)报告 add dl,30h

mov es:[di],dx

dec si

add di,2

loop l

pop dx

pop ax

jmp start

xs1:

push ax

push dx

mov ax,0b800h

mov es,ax

mov si,9

mov di,28

mov cx,10

mov dh,2

ll:

mov dl,numb1[si]

add dl,30h

mov es:[di],dx

dec si

add di,2

loop ll

pop dx

pop ax

jmp start

tiaozh_0:mov dx,fsf0

cmp dx,fsf1 ;小数点除法的调整

29

课程 课程设计(综合实验)报告 ja tiaozh3

jb tiaozh4

tiaozh:mov dx,fsf0

cmp dx,fsf1 ;小数点加法的调整 ja tiaozh1

jb tiaozh2

tiaozh1:

mov dx,fsf0

mov fsf,dx

sub dx,fsf1

yiwei1:

mov cx,10

mov si,0

mov al,0

just1: ;

xchg al,numb1[si]

inc si

loop just1

dec dx

cmp dx,0

jz tiao

jmp yiwei1

tiaozh2:

mov dx,fsf1

mov fsf,dx

sub dx,fsf0

yiwei2: 因为小数点的个数进行调整

30

课程 课程设计(综合实验)报告 mov cx,10

mov si,0

mov al,0

just0: ;同理

xchg al,numb0[si] inc si loop just0 dec dx cmp dx,0 jz tiao jmp yiwei2

tiaozh3:

mov dx,fsf0

mov fsf,dx

sub dx,fsf1

jmp check_0

tiaozh4:

mov dx,fsf0

mov fsf,dx

sub dx,fsf1

jmp check_0

xsxs: mov dl,'.' ;显示小数点的程序 mov es:[di],dx

add di,2

inc fsf

jmp a

tiao:

cmp yunf,1

jz huizh1 ;置运算符完毕后返回输入 cmp yunf,2

31

课程 课程设计(综合实验)报告

jz huizh2

cmp yunf,3

jz huizh2

cmp yunf ,4

jz huizh2

rechange0:mov numb0[si],0ah

dec si

jnz retrans

jmp next

32

相关推荐