首页 简单计算器的汇编实现

简单计算器的汇编实现

举报
开通vip

简单计算器的汇编实现微机原理实验报告 一、 设计名称 数字计算器的汇编语言实现 二、设计任务 利用8086微处理器,可编程并行通信接口芯片8255A等相关器件在proteus中设计仿真一个简单数字计算器,利用8086汇编语言编写完成加、减、乘、除、幂运算、阶乘运算、求余运算等功能,能实现键盘十进制运算表达式的输入和显示,按“=”后输出十进制表示的运算结果。 三、需求分析 (一)根据数据的输入要求对键盘(本实验中用4X5按钮阵来代替键盘)的数据读取及运算符号读取进行定义,根据8255A的相关性质对其进行编程实现,使每一个按钮对应一个十...

简单计算器的汇编实现
微机原理 实验报告 化学实验报告单总流体力学实验报告观察种子结构实验报告观察种子结构实验报告单观察种子的结构实验报告单 一、 设计名称 数字计算器的汇编语言实现 二、设计任务 利用8086微处理器,可编程并行通信接口芯片8255A等相关器件在proteus中设计仿真一个简单数字计算器,利用8086汇编语言编写完成加、减、乘、除、幂运算、阶乘运算、求余运算等功能,能实现键盘十进制运算表达式的输入和显示,按“=”后输出十进制表示的运算结果。 三、需求分析 (一)根据数据的输入要求对键盘(本实验中用4X5按钮阵来代替键盘)的数据读取及运算符号读取进行定义,根据8255A的相关性质对其进行编程实现,使每一个按钮对应一个十以内的整数或者某一个运算符号。 (二)根据8255A的输出性质,选择输出端口,对其进行编程,8255A为8086微处理器与外部设备之间提供并行输入/输出的通道。不用附加外部电路,并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。 (三)数据的显示有LED数码管显示,LED数码管有7个字符段和一个小数点段组成,每段对应一个二极管,当二极管点亮时,相应的的字符段点亮,可以进行数据的显示。 四、总体 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 首先利用程序不断扫描所设的按钮键盘是不是有输入,如果没有就一直扫描,如果有就调用子程序进行判断,是数值则进行存储并同时进行显示,是运算符号等就调用相应的子程序进行操作,操作后则继续利用程序不断扫描键盘是不是有输入,从而实现部分十进制数的加、减、乘、除、幂运算、阶乘运算、求最大公约数的运算。运算完成后根据程序将运算的结果储存到锁存器中并显示到LED显示器上。 五、硬件设计 本次实验需要的元器件有:8086微处理器、可编程并行通信接口芯片8255A、输入输出锁存器74LS373、LED数码显示管、若干按钮组成的4X5矩阵按键、若干电阻、总线等。 1、8086微处理器 当引脚接高电平时,CPU工作于最小模式。此时,引脚信号24~31的含义及其功能如下: (1)IO/M:存储器、I/O端口选择控制信号。信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时访问存储器,表示当前要进行CPU与存储器之间的数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。 (2)WR:写信号,输出,低电平有效。信号有效时,表明CPU正在执行写总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。 (3)INTA:可屏蔽中断响应信号,输出,低电平有效。 CPU通过信号对外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的中断请求,即将执行中断服务程序。 (4)ALE:地址锁存允许信号,输出,高电平有效。 CPU利用ALE信号可以把AD15 ~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在地址锁存器中。 (5)DT:数据发送/接收信号,输出,三态。DT/信号用来控制数据传送的方向。DT/为高电平时,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又重新获得对总线的控制权。 2、可编程并行通信接口芯片8255A 8255A可为8086微处理器与外部设备之间提供并行输入/ 输出的通道。通过编程可以设置芯片的工作方式,因此,用8255A连接外部设备时,通常不用再附加外部电路。并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。 在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。外设在收到这个回答信号后,就撤消数据和“输入准备好”信号。数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。CPU可用查询方式或中断方式从接口中读取数据。接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。 在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便CPU输出下一个数据。 定义工作方式控制字: 3、LED数码显示管 LED由7个字符段和一个小数点段组成,每段对应一个发光二极管,当发光二极管点亮时,相应的字符段点亮。LED有共阴极和共阳极两种供应状态。共阴极显示时,将LED显示的COM接地,将八个字符段端a、b、c、d、e、f、g、dp依次与一个8位I/O口的最低到最高位连接,当I/O给LED的哪个字符段送入一个高电平时,该段就被点亮,从而可从这7个字符段中被点亮的构成相应的字符显示出来。同理,COM阳极即将COM端接Vcc,其显示原理与COM阴极的基本相同,但I/O口送入低电平是相应的段才被点亮。 4、4×5矩阵按键 因为4×5矩阵键盘有9个管脚,于是将键盘的行接口接到8255A的PC口,列接口接到8255A的列接口。行键盘扫描一般要求有一部分的I/O口的工作方式是输入,另一部分I/O是输出,具体到4×5键盘则要求4个I/O口输入,另外4个输出,所以PC口接行。而PA、PB口要么全部输入或输出,所以PA 口接列接口,而所对应的键值=行数*5+列数,我们定义当键值在0~9之间时输入数据,当键值在10~16之间是分别实现加、减、乘、除、幂运算、阶乘、求余的运算,当键值为18时为等号,键值为19时为清零号。 六、软件设计 (1)键盘输入的程序流程图 (2)计算器运算流程图 (3)源代码 DATA  SEGMENT X  DB        ?,?,?,?    ;存放数据的每一位 X1  DW        ?          ;存放第一个数据值 X2  DW        ?          ;存放第二个数据值 Y  DW        ?          ;存放运算结果 S  DB        ?          ;存放运算符号值 E  DB        ?          ;按下等号键标记 CC  DB        ?          ;存放运算数据位数 H  DB        0          ;存放按键行号 L  DB        0          ;存放按键列号 DISCODE  DB        3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H        ;段码表 DATA  ENDS        CODE  SEGMENT ASSUME    CS:CODE,DS:DATA START:  MOV      AX,DATA MOV      DS,AX MOV      AL,90H  ;设置为A口输入,B口输出,C口输出 OUT      46H,AL MOV      DI,OFFSET X+3          ;DI指向X的高位 KKK:  CALL      KEY                    ;扫描按键 JMP      KKK ;以下为按键扫描子程序,程序返回后,在变量H和L中存放当前按键的行列号 KEY  PROC CHECK:  CALL      DISP        ;等待按键按下的同时进行显示 MOV      AL,0F0H    ;所有行输出低电平 OUT      44H,AL IN        AL,40H CMP      AL,0FFH    ;读列值 JZ        CHECK      ;若都为高电平则无键按下,等待 MOV      CX,50 LOOP      $          ;延时消抖 IN        AL,DX      ;重读列值 CMP      AL,0FFH JZ        CHECK      ;无键按下一直等待 MOV      H,0        ;有键按下,先把行列号变量清0 MOV      L,0 MOV      BL,01H MOV      BH,0FEH    ;扫描法读键值:从第一行开始测试,即PC0输出低电平 NEXT:  MOV      AL,BH OUT      44H,AL NEXTH:  IN        AL,40H      ;读列值,判断是第几列有键按下 TEST      AL,BL      ;从第一列开始判断 JZ        WAIT0 ROL      BL,1 CMP      BL,20H      ;当前行状态下没有任何列有键按下,则转为对下一行的测试 JZ        NEXTL INC      H          ;每判断一列,列号加1 JMP      NEXTH      ;再对下一列进行判断 NEXTL:  MOV      H,0 MOV      BL,01H ROL      BH,1;对下一行测试,让下一个PC口输出低电平 CMP      BH,0EFH JZ        EXIT INC      L JMP      NEXT WAIT0:  IN        AL,40H      ;若有键按下,则等该按键松开后再计算键值 CMP      AL,0FFH JNZ      WAIT0 MOV      CX,50 LOOP      $          ;延时消抖 IN        AL,40H CMP      AL,0FFH JNZ      WAIT0 CALL      KEYVALUE    ;调计算键值子程序 EXIT:  RET KEY  ENDP ;以下为计算键值子程序,通过行列号计算键值(键值=行号*5+列号) ;键值存放在DL寄存器中 KEYVALUE  PROC MOV      DL,L MOV      DH,H XOR      AX,AX MOV      AL,5 MUL      DL MOV      DL,AL      ;行号乘5 ADD      DL,DH CMP      DL,9        ;按下的是数字键 JNG      NUM_CALL CMP      DL,18 JL        CONT_CALL  ;按下的是运算键 CMP      DL,18 JZ        OUTP_CALL  ;按下的是等于键 CMP      DL,19 JZ        CLR_CALL    ;按下的是清除键 NUM_CALL:  CALL      NUMBER      ;调数字键处理子程序 JMP      EXIT1 CONT_CALL:  MOV      S,DL        ;存放运算键的键值 MOV      E,0 CALL      COUNT      ;调运算键处理子程序,计算第一个加数 JMP      EXIT1 OUTP_CALL:  CALL      OUTP        ;调等号键处理子程序 JMP      EXIT1 CLR_CALL:  CALL      CLEAR      ;调清除键处理子程序 EXIT1:  RET KEYVALUE  ENDP ;以下为清除键处理子程序,按下清除键后,X变量全部清0 CLEAR  PROC MOV      X[3],0 MOV      X[2],0 MOV      X[1],0 MOV      X[0],0 CALL      BITP RET CLEAR  ENDP ;以下为等号键处理子程序,该子程序负责将第二个运算数据的数值计算出来存入X2变量 ;并根据运算符号,调用相应的运算子程序 OUTP  PROC PUSH      AX PUSH      DX PUSH      BX INC      E CALL      COUNT    ;调运算键处理子程序,计算第二个运算数据 CMP      S,10 JZ        ADD_CALL  ;运算符为加号,则调用加法子程序 CMP      S,11 JZ        SUB_CALL  ;运算符为减号,则调用减法子程序 CMP      S,12 JZ        MUL_CALL  ;运算符为乘号,则调用乘法子程序 CMP      S,13 JZ        DIVP_CALL  ;运算符为除号,则调用除法子程序 CMP      S,14 JZ        PF_CALL    ;运算符为求幂,则调用求幂子程序 CMP      S,15 JZ        JC_CALL    ;运算符为阶乘,则调用阶乘子程序 CMP      S,16 CALL      QYP    ;运算符为求余,则调用求余子程序 ADD_CALL:  CALL      ADDP JMP      STORE1 SUB_CALL:  CALL      SUBP JMP      STORE1 MUL_CALL:  CALL      MULP JMP      STORE1 DIVP_CALL:  CALL      DIVP JMP      STORE1 PF_CALL:  CALL      PF JMP      STORE1 JC_CALL:  CALL      JCP STORE1:  MOV      AX,Y        ;以下程序将各运算子程序返回的运算结果,按位分解,送入X变量 CMP      AX,0 JL        CCC MOV      DX,0 MOV      BX,1000 DIV      BX MOV      X[0], AL MOV      AX,DX JMP      DDD CCC: MOV      X[0],73H MOV      AX,Y NEG      AX DDD: MOV      BL,100 DIV      BL MOV      CX,Y CMP      CX,0 JNL      EEE CMP      AL,0 JZ        FFF EEE: MOV      X[1],AL JMP      GGG FFF: MOV      X[1],85H GGG: MOV      AL,AH MOV      AH,0 MOV      BL,10 DIV      BL MOV      CX,Y CMP      CX,0 JNL      HHH CMP      AL,0 JZ        III HHH: MOV      X[2],AL JMP      JJJ III: MOV      X[2],85H JJJ: MOV      X[3],AH POP      BX POP      DX POP      AX RET OUTP  ENDP ;以下为运算键处理子程序,该程序将第一个运算数据的数值计算出来并存入X1变量 ;或者将第二个运算数据的数值计算出来并存入X2变量 ;将运算符的值存入S变量 COUNT  PROC PUSH      AX PUSH      BX PUSH      DX MOV      DX,0 CALL      BITP        ;测试X中的数据是多少位 CMP      CC,4        ;输入的数据是4位数 ? JZ        C4 CMP      CC,3        ;输入的数据是3位数 ? JZ        C3 CMP      CC,2        ;输入的数据是2位数 ? JZ        C2 JMP      C1          ;输入的数据是1位数 ? C4:  MOV      AX,0 MOV      AL,X[0] MOV      BX,1000 MUL      BX MOV      DX,AX C3:  MOV      AL,X[1] MOV      BL,100 MUL      BL ADD      DX,AX C2:  MOV      AL,X[2] MOV      BL,10 MUL      BL ADD      DX,AX C1:  MOV      AL,X[3] MOV      AH,0 ADD      DX,AX CMP      E,1 JNZ      X1_S MOV      X2,DX      ;按下的是等号,则将第二个运算数据的值存入X2变量 JMP      EXIT3 X1_S:  MOV      X1,DX      ;按下的是运算符号,则将第一个运算数据的值存X1变量 MOV      X[3],0      ;清空X变量 MOV      X[2],0 MOV      X[1],0 MOV      X[0],0 EXIT3:  POP      DX POP      BX POP      AX RET COUNT  ENDP ;以下为数字键处理子程序 ;该程序,将输入的数据按位存放在X变量中,并由CC记录数据的位数 NUMBER  PROC CMP      E,1 JNZ      CONTINUE MOV      E,0 CALL      CLEAR CONTINUE:  CMP      CC,0        ;目前数据为0位,即没有数据,则转到SSS JZ        SSS ;若已有数据,以下程序将X左移8位。 ;例如:先输入“1”,当再输入2时, ;先要将“1”从个位移到十位,然后再将“2”存放到个位 PUSH      AX PUSH      DX MOV      AL,X[3] MOV      AH,X[2] MOV      DL,X[1] MOV      DH,X[0] MOV      CX,8 LL:  SHL      AX, 1 RCL      DX,1 LOOP      LL MOV      X[3],AL MOV      X[2],AH MOV      X[1],DL MOV      X[0],DH POP      DX POP      AX SSS:  MOV      [DI],DL    ;将当前键入的数据存放到X的最低位 INC      CC          ;数据位数加1 CMP      CC,4        ;判断数据位数 JNG      EXIT2 MOV      CC,0        ;如果数据超过4位,重新从最低位开始存放 MOV      X[2],0 MOV      X[1],0 MOV      X[0],0 EXIT2:  CALL      DISP        ;调显示子程序,显示输入的数据 RET NUMBER  ENDP ;加法子程序 ADDP  PROC PUSH      AX MOV      AX,X1 ADD      AX,X2 MOV      Y,AX POP      AX RET ADDP  ENDP ;减法子程序 SUBP  PROC PUSH      AX MOV      AX,X1 SUB      AX,X2 MOV      Y,AX POP      AX RET SUBP  ENDP ;乘法子程序 MULP  PROC PUSH      AX PUSH      DX MOV      AX,X1 MOV      DX,X2 MUL      DX MOV      Y,AX POP      DX POP      AX RET MULP  ENDP ;除法子程序 DIVP  PROC PUSH      AX PUSH      BX PUSH      DX MOV      DX,0 MOV      AX,X1 MOV      BX,X2 DIV      BX MOV      Y,AX POP      DX POP      BX POP      AX RET DIVP  ENDP ;求幂子程序 PF  PROC PUSH  AX PUSH  DX PUSH  CX MOV    CX,X2 MOV    DX,X1 MOV    AX,X1 DEC    CX LOP:  MUL    DX MOV    DX,X1 LOOP  LOP MOV    Y,AX POP    CX POP    DX POP    AX RET PF  ENDP ;阶乘子程序 JCP  PROC PUSH  AX PUSH  BX PUSH  CX MOV    CX,X1 MOV    AX,X1 MOV    BX,AX DEC    BX DEC    CX BEGIN:  MUL    BX DEC    BX LOOP  BEGIN MOV    Y,AX POP    CX POP    BX POP    AX RET JCP  ENDP ;求余子程序 QYP  PROC PUSH      AX PUSH      BX PUSH      DX MOV      DX,0 MOV      AX,X1 MOV      BX,X2 DIV      BX MOV      Y,DX POP      DX POP      BX POP      AX RET QYP  ENDP ;显示子程序 ,将X中的数值按位显示出来 DISP  PROC PUSH      BX PUSH      AX MOV      BH,0 LEA      SI,DISCODE CALL      BITP        ;测试X位数 CMP      CC,4 JZ        QIAN CMP      CC,3 JZ        BAI CMP      CC,2 JZ        SHI CMP      CC,1 JMP      G JMP      NONE QIAN:  MOV      AH,11100000B            ;从第4位开始显示 MOV      AL,AH OUT      44H,AL MOV      BL,X[0] MOV      AL,[SI+BX] OUT      42H,AL CALL      DELY MOV      AL,0 OUT      42H,AL BAI:  MOV      AH,11010000B            ;从第3位开始显示 MOV      AL,AH OUT      44H,AL MOV      BL,X[1] MOV      AL,[SI+BX] OUT      42H,AL CALL      DELY MOV      AL,0 OUT      42H,AL SHI:  MOV      AH,10110000B            ;从第2位开始显示 MOV      AL,AH OUT      44H,AL MOV      BL,X[2] MOV      AL,[SI+BX] OUT      42H,AL CALL      DELY MOV      AL,0 OUT      42H,AL G:  MOV      AH,01110000B            ;从第1位开始显示 MOV      AL,AH OUT      44H,AL MOV      BL,X[3] MOV      AL,[SI+BX] OUT      42H,AL CALL      DELY JMP      EXIT4 NONE:  MOV      AL,0        ;X中没有数据,不显示 OUT      42H,AL EXIT4:  POP      AX POP      BX RET DISP  ENDP ;分析数据位数子程序 BITP  PROC CMP      X[0],0    ;如果X[0]不为0,则数据为4位数 JNZ      FOURBIT CMP      X[1],0    ;如果X[1]不为0,则数据为3位数 JNZ      THREEBIT CMP      X[2],0    ;如果X[2]不为0,则数据为2位数 JNZ      TOWBIT CMP      X[3],0    ;如果X[3]不为0,则数据为1位数 JNZ      ONEBIT JMP      ZER0BIT    ;否则,没有数据 FOURBIT:  MOV      CC,4 JMP      EXIT5 THREEBIT:  MOV      CC,3 JMP      EXIT5 TOWBIT:  MOV      CC,2 JMP      EXIT5 ONEBIT:  MOV      CC,1 JMP      EXIT5 ZER0BIT:  MOV      CC,0 EXIT5:  RET BITP  ENDP ;延时子程序 DELY  PROC PUSH      CX MOV      CX,100 LOOP      $ POP      CX RET DELY  ENDP CODE  ENDS END      START 七、调试与测试 (1)任意四位十进制的加法。 输入X1=321;X2=567 (2)任意四位十进制的减法。 输入X1=321;X2=567 (3)任意四位十进制的乘法。 输入X1=21;X2=4 (4)任意四位十进制的除法。 输入X1=39;X2=3 (5)任意有效位十进制的求幂。 输入X1=3;X2=4 (6)任意有效位十进制的阶乘。 输入X1=4; (7)任意有效位十进制的求余。 输入X1=9;X2=4 八、关键技术 (1)、通过按键扫描程序,来确定输入的字符类型(数字、运算符、等号、清除),并通过判断语句将输入存入相应的位置; (2)、一般减法无法将小数减大数的结果正确显示,本设计通过部分关键子程序可以实现负数的显示; (3)、在完成各项功能时应确保各个子程序模块的协调调用,互不影响。 九、实际完成的功能 (1)加法功能 当输入X1、X2和加法运算符时,进行加法子程序调用,完成加法功能。 (2)减法功能 1、当输入X1>=X2时,输入乘法运算符,实现X1-X2的运算,完成减法功能,将结果输出。 2、当输入X1 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf 1、任务分工 高  康:主要负责部分代码的编写和实验报告的完成 姜  达:主要负责部分代码的编写和总体的调试与测试 李晓辉:主要负责部分代码的编写和相关资料的收集 2、遇到的问题及解决方法 (1)、问题:按键的扩展。最初考虑扩展时,增加一行按键,但由于C口为输出,且PC4、PC5、PC6、PC7控制数码管的输出位数,因此不能正常进行按键扫描。 解决方法:增加一列按键,通过A口控制,实现了4X5的按键功能扩展。 (2)、问题:在实现负数的输出时,若为一位负数,百位和十位的0会显示(如为-1,则输出为-001)。 解决方法:对输出部分子程序进行修改,加入判断语句,需要注意的是,在修改过程中必须有清晰的思路,否则会比较混乱。 3、未解决的问题 求最大公约数的子程序和清除一位的子程序未能调试成功。调试时 编译可以通过,但运行时出错,请教了别的同学,调试了很长时间均未成功,但在Debug中调试也是正确的,目前还未解决此问题。因此剩余一个按键处于闲置状态,未实现功能。
本文档为【简单计算器的汇编实现】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_633423
暂无简介~
格式:doc
大小:102KB
软件:Word
页数:0
分类:互联网
上传时间:2019-08-23
浏览量:12