久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 基于8086的計(jì)算器匯編程序與Proteus仿真圖 [打印本頁]

作者: anan111    時(shí)間: 2022-4-30 11:23
標(biāo)題: 基于8086的計(jì)算器匯編程序與Proteus仿真圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)




8086匯編語言源程序如下:
  1.         DATA  SEGMENT
  2.            X  DB        ?,?,?,?     ;存放數(shù)據(jù)的每一位
  3.           X1  DW        ?           ;存放第一個數(shù)據(jù)值
  4.           X2  DW        ?           ;存放第二個數(shù)據(jù)值
  5.            Y  DW        ?           ;存放運(yùn)算結(jié)果
  6.            S  DB        ?           ;存放運(yùn)算符號值
  7.            E  DB        ?           ;按下等號鍵標(biāo)記
  8.           CC  DB        ?           ;存放運(yùn)算數(shù)據(jù)位數(shù)
  9.            H  DB        0           ;存放按鍵行號
  10.            L  DB        0           ;存放按鍵列號
  11.      DISCODE  DB        3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H         ;段碼表
  12.         DATA  ENDS

  13.         CODE  SEGMENT
  14.               ASSUME    CS:CODE,DS:DATA

  15.       START:  MOV       AX,DATA
  16.               MOV       DS,AX

  17.               MOV       AL,90H      ;設(shè)置為A口輸入,B口輸出,C口輸出
  18.               OUT       46H,AL
  19.               MOV       DI,OFFSET X+3           ;DI指向X的高位
  20.         KKK:  CALL      KEY         ;掃描按鍵
  21.               JMP       KKK

  22. ;以下為按鍵掃描子程序,程序返回后,在變量H和L中存放當(dāng)前按鍵的行列號
  23.          KEY  PROC
  24.       CHECK:  CALL      DISP        ;等待按鍵按下的同時(shí)進(jìn)行顯示
  25.               MOV       AL,0F0H     ;所有行輸出低電平
  26.               OUT       44H,AL
  27.               IN        AL,40H
  28.               CMP       AL,0FFH     ;讀列值
  29.               JZ        CHECK       ;若都為高電平則無鍵按下,等待
  30.               MOV       CX,50
  31.               LOOP      $           ;延時(shí)消抖
  32.               IN        AL,DX       ;重讀列值
  33.               CMP       AL,0FFH
  34.               JZ        CHECK       ;無鍵按下一直等待

  35.               MOV       H,0         ;有鍵按下,先把行列號變量清0
  36.               MOV       L,0
  37.               MOV       BL,01H
  38.               MOV       BH,0FEH     ;掃描法讀鍵值:從第一行開始測試,即PC0輸出低電平
  39.        NEXT:  MOV       AL,BH
  40.               OUT       44H,AL
  41.       NEXTH:  IN        AL,40H      ;讀列值,判斷是第幾列有鍵按下
  42.               TEST      AL,BL       ;從第一列開始判斷
  43.               JZ        WAIT0
  44.               ROL       BL,1
  45.               CMP       BL,10H      ;當(dāng)前行狀態(tài)下沒有任何列有鍵按下,則轉(zhuǎn)為對下一行的測試
  46.               JZ        NEXTL
  47.               INC       H           ;每判斷一列,列號加1
  48.               JMP       NEXTH       ;再對下一列進(jìn)行判斷
  49.       NEXTL:  MOV       H,0
  50.               MOV       BL,01H
  51.               ROL       BH,1        ;對下一行測試,讓下一個PC口輸出低電平
  52.               CMP       BH,0EFH
  53.               JZ        EXIT
  54.               INC       L
  55.               JMP       NEXT

  56.       WAIT0:  IN        AL,40H      ;若有鍵按下,則等該按鍵松開后再計(jì)算鍵值
  57.               CMP       AL,0FFH
  58.               JNZ       WAIT0
  59.               MOV       CX,50
  60.               LOOP      $           ;延時(shí)消抖
  61.               IN        AL,40H
  62.               CMP       AL,0FFH
  63.               JNZ       WAIT0
  64.               CALL      KEYVALUE    ;調(diào)計(jì)算鍵值子程序
  65.        EXIT:  RET
  66.          KEY  ENDP


  67.    ;以下為計(jì)算鍵值子程序,通過行列號計(jì)算鍵值(鍵值=列號*4+行號)
  68.    ;鍵值存放在DL寄存器中
  69.     KEYVALUE  PROC
  70.               MOV       DL,L
  71.               MOV       DH,H
  72.               SHL       DL,1
  73.               SHL       DL,1        ;列號乘4
  74.               ADD       DL,DH
  75.               CMP       DL,9        ;按下的是數(shù)字鍵
  76.               JNG       NUM_CALL
  77.               CMP       DL,14
  78.               JL        CONT_CALL   ;按下的是運(yùn)算鍵
  79.               CMP       DL,14
  80.               JZ        OUTP_CALL   ;按下的是等于鍵
  81.               CMP       DL,15
  82.               JZ        CLR_CALL    ;按下的是清除鍵

  83.    NUM_CALL:  CALL      NUMBER      ;調(diào)數(shù)字鍵處理子程序
  84.               JMP       EXIT1
  85.   CONT_CALL:  MOV       S,DL        ;存放運(yùn)算鍵的鍵值
  86.               MOV       E,0
  87.               CALL      COUNT       ;調(diào)運(yùn)算鍵處理子程序,計(jì)算第一個加數(shù)
  88.               JMP       EXIT1
  89.   OUTP_CALL:  CALL      OUTP        ;調(diào)等號鍵處理子程序
  90.               JMP       EXIT1
  91.    CLR_CALL:  CALL      CLEAR       ;調(diào)清除鍵處理子程序
  92.       EXIT1:  RET
  93.     KEYVALUE  ENDP


  94. ;以下為清除鍵處理子程序,按下清除鍵后,X變量全部清0
  95.        CLEAR  PROC
  96.               MOV       X[3],0
  97.               MOV       X[2],0
  98.               MOV       X[1],0
  99.               MOV       X[0],0
  100.               CALL      BITP
  101.               RET
  102.        CLEAR  ENDP


  103. ;以下為等號鍵處理子程序,該子程序負(fù)責(zé)將第二個運(yùn)算數(shù)據(jù)的數(shù)值計(jì)算出來存入X2變量
  104. ;并根據(jù)運(yùn)算符號,調(diào)用相應(yīng)的運(yùn)算子程序
  105.         OUTP  PROC
  106.               PUSH      AX
  107.               PUSH      DX
  108.               PUSH      BX
  109.               INC       E
  110.               CALL      COUNT       ;調(diào)運(yùn)算鍵處理子程序,計(jì)算第二個運(yùn)算數(shù)據(jù)
  111.               CMP       S,10
  112.               JZ        ADD_CALL    ;運(yùn)算符為加號,則調(diào)用加法子程序
  113.               CMP       S,11
  114.               JZ        SUB_CALL    ;運(yùn)算符為減號,則調(diào)用減法子程序
  115.               CMP       S,12
  116.               JZ        MUL_CALL    ;運(yùn)算符為乘號,則調(diào)用乘法子程序
  117.               CMP       S,13
  118.               CALL      DIVP        ;運(yùn)算符為除號,則調(diào)用除法子程序
  119.               JMP       STORE1
  120.    ADD_CALL:  CALL      ADDP
  121.               JMP       STORE1
  122.    SUB_CALL:  CALL      SUBP
  123.               JMP       STORE1
  124.    MUL_CALL:  CALL      MULP

  125.      STORE1:  MOV       AX,Y        ;以下程序?qū)⒏鬟\(yùn)算子程序返回的運(yùn)算結(jié)果,按位分解,送入X變量
  126.               MOV       DX,0
  127.               MOV       BX,1000
  128.               DIV       BX
  129.               MOV       X[0], AL
  130.               MOV       AX,DX
  131.               MOV       BL,100
  132.               DIV       BL
  133.               MOV       X[1],AL
  134.               MOV       AL,AH
  135.               MOV       AH,0
  136.               MOV       BL,10
  137.               DIV       BL
  138.               MOV       X[2],AL
  139.               MOV       X[3],AH
  140.               POP       BX
  141.               POP       DX
  142.               POP       AX
  143.               RET
  144.         OUTP  ENDP

  145. ;以下為運(yùn)算鍵處理子程序,該程序?qū)⒌谝粋運(yùn)算數(shù)據(jù)的數(shù)值計(jì)算出來并存入X1變量
  146. ;或者將第二個運(yùn)算數(shù)據(jù)的數(shù)值計(jì)算出來并存入X2變量
  147. ;將運(yùn)算符的值存入S變量
  148.        COUNT  PROC
  149.               PUSH      AX
  150.               PUSH      BX
  151.               PUSH      DX
  152.               MOV       DX,0
  153.               CALL      BITP        ;測試X中的數(shù)據(jù)是多少位
  154.               CMP       CC,4        ;輸入的數(shù)據(jù)是4位數(shù) ?
  155.               JZ        C4
  156.               CMP       CC,3        ;輸入的數(shù)據(jù)是3位數(shù) ?
  157.               JZ        C3
  158.               CMP       CC,2        ;輸入的數(shù)據(jù)是2位數(shù) ?
  159.               JZ        C2
  160.               JMP       C1          ;輸入的數(shù)據(jù)是1位數(shù) ?

  161.          C4:  MOV       AX,0
  162.               MOV       AL,X[0]
  163.               MOV       BX,1000
  164.               MUL       BX
  165.               MOV       DX,AX

  166.          C3:  MOV       AL,X[1]
  167.               MOV       BL,100
  168.               MUL       BL
  169.               ADD       DX,AX

  170.          C2:  MOV       AL,X[2]
  171.               MOV       BL,10
  172.               MUL       BL
  173.               ADD       DX,AX

  174.          C1:  MOV       AL,X[3]
  175.               MOV       AH,0
  176.               ADD       DX,AX
  177.               CMP       E,1
  178.               JNZ       X1_S
  179.               MOV       X2,DX       ;按下的是等號,則將第二個運(yùn)算數(shù)據(jù)的值存入X2變量
  180.               JMP       EXIT3
  181.        X1_S:  MOV       X1,DX       ;按下的是運(yùn)算符號,則將第一個運(yùn)算數(shù)據(jù)的值存X1變量
  182.               MOV       X[3],0      ;清空X變量
  183.               MOV       X[2],0
  184.               MOV       X[1],0
  185.               MOV       X[0],0
  186.       EXIT3:  POP       DX
  187.               POP       BX
  188.               POP       AX
  189.               RET
  190.        COUNT  ENDP


  191. ;以下為數(shù)字鍵處理子程序
  192. ;該程序,將輸入的數(shù)據(jù)按位存放在X變量中,并由CC記錄數(shù)據(jù)的位數(shù)
  193.       NUMBER  PROC
  194.               CMP       E,1
  195.               JNZ       CONTINUE
  196.               MOV       E,0
  197.               CALL      CLEAR
  198.    CONTINUE:  CMP       CC,0        ;目前數(shù)據(jù)為0位,即沒有數(shù)據(jù),則轉(zhuǎn)到SSS
  199.               JZ        SSS
  200. ;若已有數(shù)據(jù),以下程序?qū)左移8位。
  201. ;例如:先輸入“1”,當(dāng)再輸入2時(shí),
  202. ;先要將“1”從個位移到十位,然后再將“2”存放到個位
  203.               PUSH      AX
  204.               PUSH      DX
  205.               MOV       AL,X[3]
  206.               MOV       AH,X[2]
  207.               MOV       DL,X[1]
  208.               MOV       DH,X[0]
  209.               MOV       CX,8
  210.          LL:  SHL       AX, 1
  211.               RCL       DX,1
  212.               LOOP      LL
  213.               MOV       X[3],AL
  214.               MOV       X[2],AH
  215.               MOV       X[1],DL
  216.               MOV       X[0],DH
  217.               POP       DX
  218.               POP       AX
  219.         SSS:  MOV       [DI],DL     ;將當(dāng)前鍵入的數(shù)據(jù)存放到X的最低位
  220.               INC       CC          ;數(shù)據(jù)位數(shù)加1
  221.               CMP       CC,4        ;判斷數(shù)據(jù)位數(shù)
  222.               JNG       EXIT2
  223.               MOV       CC,0        ;如果數(shù)據(jù)超過4位,重新從最低位開始存放
  224.               MOV       X[2],0
  225.               MOV       X[1],0
  226.               MOV       X[0],0
  227.       EXIT2:  CALL      DISP        ;調(diào)顯示子程序,顯示輸入的數(shù)據(jù)
  228.               RET
  229.       NUMBER  ENDP

  230. ;加法子程序
  231.         ADDP  PROC
  232.               PUSH      AX
  233.               MOV       AX,X1
  234.               ADD       AX,X2
  235.               MOV       Y,AX
  236.               POP       AX
  237.               RET
  238.         ADDP  ENDP
  239. ;減法子程序
  240.         SUBP  PROC
  241.               PUSH      AX
  242.               MOV       AX,X1
  243.               SUB       AX,X2
  244.               MOV       Y,AX
  245.               POP       AX
  246.               RET
  247.         SUBP  ENDP
  248. ;乘法子程序
  249.         MULP  PROC
  250.               PUSH      AX
  251.               PUSH      DX
  252.               MOV       AX,X1
  253.               MOV       DX,X2
  254.               MUL       DX
  255.               MOV       Y,AX
  256.               POP       DX
  257.               POP       AX
  258.               RET
  259.         MULP  ENDP
  260. ;除法子程序
  261.         DIVP  PROC
  262.               PUSH      AX
  263.               PUSH      BX
  264.               PUSH      DX
  265.               MOV       DX,0
  266.               MOV       AX,X1
  267.               MOV       BX,X2
  268.               DIV       BX
  269.               MOV       Y,AX
  270.               POP       DX
  271.               POP       BX
  272.               POP       AX
  273.               RET
  274.         DIVP  ENDP

  275. ;顯示子程序 ,將X中的數(shù)值按位顯示出來
  276.         DISP  PROC
  277.               PUSH      BX
  278.               PUSH      AX
  279.               MOV       BH,0
  280.               LEA       SI,DISCODE
  281.               CALL      BITP        ;測試X位數(shù)
  282.               CMP       CC,4
  283.               JZ        QIAN
  284.               CMP       CC,3
  285.               JZ        BAI
  286.               CMP       CC,2
  287.               JZ        SHI
  288.               CMP       CC,1
  289.               JMP       G
  290.               JMP       NONE

  291.        QIAN:  MOV       AH,11100000B            ;從第4位開始顯示
  292.               MOV       AL,AH
  293.               OUT       44H,AL
  294.               MOV       BL,X[0]
  295.               MOV       AL,[SI+BX]
  296.               OUT       42H,AL
  297.               CALL      DELY
  298.               MOV       AL,0
  299.               OUT       42H,AL

  300.         BAI:  MOV       AH,11010000B            ;從第3位開始顯示
  301.               MOV       AL,AH
  302.               OUT       44H,AL
  303.               MOV       BL,X[1]
  304.               MOV       AL,[SI+BX]
  305.               OUT       42H,AL
  306.               CALL      DELY
  307.               MOV       AL,0
  308.               OUT       42H,AL

  309.         SHI:  MOV       AH,10110000B            ;從第2位開始顯示
  310.               MOV       AL,AH
  311.               OUT       44H,AL
  312.               MOV       BL,X[2]
  313.               MOV       AL,[SI+BX]
  314.               OUT       42H,AL
  315.               CALL      DELY
  316.               MOV       AL,0
  317.               OUT       42H,AL

  318.           G:  MOV       AH,01110000B            ;從第1位開始顯示
  319.               MOV       AL,AH
  320.               OUT       44H,AL
  321.               MOV       BL,X[3]
  322.               MOV       AL,[SI+BX]
  323.               OUT       42H,AL
  324.               CALL      DELY
  325.               JMP       EXIT4
  326. ……………………

  327. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
代碼與Proteus仿真下載:
計(jì)算器8086.7z (45.45 KB, 下載次數(shù): 109)



作者: zxc13643542777    時(shí)間: 2022-12-20 16:08
沒代碼
作者: zxc13643542777    時(shí)間: 2022-12-20 16:49
誤會了,我傻了
作者: 鬼鬼YYDS    時(shí)間: 2023-5-27 18:03
這個計(jì)算器還是不錯的,我下載下來學(xué)習(xí)了
作者: KK27    時(shí)間: 2023-12-1 11:06
鬼鬼YYDS 發(fā)表于 2023-5-27 18:03
這個計(jì)算器還是不錯的,我下載下來學(xué)習(xí)了

可以分享下嘛




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 中文字幕第一页在线 | 欧美日韩中文国产一区发布 | 亚洲美女视频 | 日韩三级免费网站 | 全免费a级毛片免费看视频免费下 | 欧洲精品在线观看 | 国产一级一片免费播放 | www久久av | 激情的网站| 亚洲码欧美码一区二区三区 | 黄色网址在线免费观看 | 成人特区 | 日韩欧美在线一区二区 | 黄色网毛片| 精品视频99 | 日韩a在线 | 99re国产视频 | 久久久久久久久国产 | 日本久久久影视 | 国产精品自拍视频 | 一级黄色裸片 | 乳色吐息在线观看 | 中文字幕一区二区三区四区五区 | 亚洲一二三区在线观看 | av片在线播放 | www.四虎.com| 日日操操| 午夜久草| 一区二区三区网站 | 麻豆av电影网 | 久久久一区二区三区 | 中文av电影| 亚洲免费在线观看 | 午夜视频一区 | 国产丝袜一区二区三区免费视频 | 日韩精品一区二区三区在线观看 | 亚洲人a| 午夜丰满寂寞少妇精品 | 亚洲人在线播放 | 国产精品久久久精品 | 国产视频2021|