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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11658|回復: 3
收起左側

51單片機挺好用的匯編子程序匯總,有用拿走

[復制鏈接]
ID:275310 發表于 2018-1-12 18:07 | 顯示全部樓層 |閱讀模式
51挺好用的子程序匯總,有用拿走!

所有資料51hei提供下載:
MSC51PRO.rar (19.76 KB, 下載次數: 120)


單片機匯編語言源程序如下:
  1. ;MCS-51單片機實用子程序庫
  2. ;片內RAM初始化子程序
  3. IBCLR:         MOV A,R0
  4.          MOV R1,A
  5.          CLR A
  6. IBC1:         MOV @R1,A
  7.          INC R1
  8.          DJNZ R7,IBC1
  9.          RET
  10. ;片外RAM初始化子程序
  11. EBCLR1: MOV A,ADDPL
  12.          MOV DPL,A
  13.          MOV A,ADDPH
  14.          MOV DPH,A
  15.          CLR C
  16. EBC11:         MOVX @DPTR,A
  17.          INC DPTR
  18.          DJNZ R7,EBC11
  19.          RET
  20. ;片外RAM初始化子程序(雙字節個單元)
  21. EBCLR2: MOV A,ADDPL
  22.          MOV DPL,A
  23.          MOV A,ADDPH
  24.          MOV DPH,A
  25.          MOV A,R7
  26.          JZ EBC21
  27.          INC R6
  28. EBC21:         CLR A
  29.          MOVX @DPTR,A
  30.          INC DPTR
  31.          DJNZ R7,EBC21
  32.          DJNZ R6,EBC21
  33.          RET
  34. ;內部RAM數據復制程序
  35. ;入口: R0,R7
  36. ;占用資源: A
  37. ;堆棧需求: 2字節
  38. ;出口: R1
  39. IBMOV:         MOV A,R0
  40.          ADD A,R7
  41.          MOV R0,A
  42.          MOV A,R1
  43.          ADD A,R7
  44.          MOV R1,A
  45. IBM1:         DEC R0
  46.          DEC R1
  47.          MOV A,@R0
  48.          MOV @R1,A
  49.          DJNZ R7,IBM1
  50.          RET
  51. ;外部RAM數據復制程序
  52. ;入口: ADDPH,ADDPL,R7
  53. ;占用資源: ACC
  54. ;堆棧需求: 2字節
  55. ;出口: R0,R1
  56. EBMOV1: MOV A,ADDPL
  57.          ADD A,R7
  58.          MOV DPL,A
  59.          CLR A
  60.          ADDC A,ADDPH
  61.          MOV DPH,A
  62.          MOV A,R7
  63.          ADD A,R1
  64.          XCH A,R0
  65.          ADDC A,#00H
  66.          MOV P2,A
  67. EBM11:         DEC R0
  68.          CJNE R0,#0FFH,EBM12
  69.          DEC P2
  70. EBM12:         DEC DPL
  71.          MOV A,DPL
  72.          CJNE A,#0FFH,EBM13
  73.          DEC DPH
  74. EBM13:         MOVX A,@R0
  75.          MOVX @DPTR,A
  76.          DJNZ R7,EBM11
  77.          RET
  78. ;外部RAM數據復制程序
  79. ;入口: ADDPH,ADDPL,R6,R7
  80. ;占用資源: ACC
  81. ;堆棧需求: 2字節
  82. ;出口: R0,R1
  83. EBMOV2: MOV A,ADDPL
  84.          ADD A,R7
  85.          MOV DPL,A
  86.          MOV A,R6
  87.          ADDC A,ADDPH
  88.          MOV DPH,A
  89.          MOV A,R7
  90.          ADD A,R1
  91.          XCH A,R0
  92.          ADDC A,R6
  93.          MOV P2,A
  94.          MOV A,R7
  95.          JZ EBM21
  96.          INC R6
  97. EBM21:         DEC R0
  98.          CJNE R0,#0FFH,EBM22
  99.          DEC P2
  100. EBM22:         DEC DPL
  101.          MOV A,DPL
  102.          CJNE A,#0FFH,EBM23
  103.          DEC DPH
  104. EBM23:         MOVX A,@R0
  105.          MOVX @DPTR,A
  106.          DJNZ R7,EBM21
  107.          DJNZ R6,EBM21
  108.          RET
  109. ;外部RAM數據復制到內部RAM程序
  110. ;入口: ADDPH,ADDPL,R7
  111. ;占用資源: ACC
  112. ;堆棧需求: 2字節
  113. ;出口: R0
  114. ITEMOV: MOV A,ADDPL
  115.          ADD A,R7
  116.          MOV DPL,A
  117.          MOV A,ADDPH
  118.          ADDC A,#00H
  119.          MOV DPH,A
  120.          MOV A,R0
  121.          ADD A,R7
  122.          MOV R0,A
  123. ITEM1:         DEC R0
  124.          DEC DPL
  125.          MOV A,DPL
  126.          CJNE A,#0FFH,ITEM2
  127.         DEC DPH
  128. ITEM2:         MOVX A,@DPTR
  129.          MOV @R0,A
  130.          DJNZ R7,ITEM1
  131.          RET
  132. ;限幅濾波程序
  133. ;入口: A,SDAT,DELTY
  134. ;占用資源: B
  135. ;堆棧需求: 2字節
  136. ;出口: A
  137. JUGFILT:MOV B,A
  138.          CLR C
  139.          SUBB A,SDAT
  140.          JNC JUGFT1
  141.          CPL A
  142.          INC A
  143. JUGFT1: SETB A
  144.          SUBB A,#DELTY
  145.          JNC JUGFT3
  146.          MOV A,SDAT
  147.          RET
  148. JUGFT3: MOV A,B
  149.          MOV SDAT,A
  150.          RET
  151. ;中位值濾波程序
  152. ;入口: ADDPH,ADDPL,N
  153. ;占用資源: ESELSORT
  154. ;堆棧需求: 4字節
  155. ;出口: A
  156. MEDFILT:LCALL ESELSORT
  157.          MOV A,N
  158.          CLR C
  159.          RRC A
  160.          ADD A,ADDPL
  161.          MOV DPL,A
  162.          MOV A,ADDPH
  163.          MOV DPH,A
  164.          JNC MEDFT1
  165.          INC DPH
  166. MEDFT1: MOVX A,@DPTR
  167.          RET
  168. ;N點算術平均濾波
  169. ;入口: ADDPH,ADDPL,N
  170. ;占用資源: B,R3,R4
  171. ;堆棧需求: 2字節
  172. ;出口: A
  173. AVFILT: MOV A,ADDPL
  174.          MOV DPL,A
  175.          MOV A,ADDPH
  176.          MOV DPH,A
  177.          CLR A
  178.          MOV R3,A
  179.          MOV R4,A
  180.          MOV R7,N
  181. AVFT1:         MOVX A,@DPTR
  182.          INC DPTR
  183.          ADD A,R4
  184.          MOV R4,A
  185.          JNC AVFT2
  186.          INC R3
  187. AVFT2:         DJNZ R7,AVFT1
  188.          MOV R7,N
  189.          MOV R2,#00H
  190.          LCALL NDIV31
  191.          MOV A,R4
  192.          RET
  193. ;N點加權平均濾波
  194. ;入口: ADDPH,ADDPL,N
  195. ;占用資源: B,R3,R4
  196. ;堆棧需求: 2字節
  197. ;出口: A
  198. QAVFILT:CLR A
  199.          MOV R3,A
  200.          MOV R4,A
  201.          MOV R7,N
  202.          MOV P2,ADDPH
  203.          MOV R1,ADDPL
  204.          MOV DPTR,#QAVTAB
  205. QAVFT1: MOVC A,@A+DPTR
  206.          MOV B,A
  207.          MOVX A,@R1
  208.          INC DPTR
  209.          INC R1
  210.          MUL AB
  211.          ADD A,R4
  212.          MOV R4,A
  213.         MOV A,B
  214.          ADDC A,R3
  215.          MOV R3,A
  216.          DJNZ R7,QAVFT1
  217.          MOV A,R4
  218.          JNB ACC.7,QAVFT2
  219.          INC R3
  220. QAVFT2: MOV A,R3
  221.          RET
  222. QAVTAB: DB
  223. ;一階加權滯后濾波程序
  224. ;入口: A,DELTY
  225. ;占用資源: B,R3,R4
  226. ;堆棧需求: 2字節
  227. ;出口: A
  228. BQFILT: MOV B,A
  229.          CLR A
  230.          MOV DPTR,#ABTAB
  231.          MOVC A,@A+DPTR
  232.          MUL AB
  233.          MOV R4,A
  234.          MOV R3,B
  235.          MOV A,#01H
  236.          MOVC A,@A+DPTR
  237.          MOV B,DELTY
  238.          MUL AB
  239.          ADD A,R4
  240.          MOV R4,A
  241.          MOV A,B
  242.          ADDC A,R3
  243.          MOV R3,A
  244.          MOV A,R4
  245.          JNB ACC.7,FT1
  246.          INC R3
  247. FT1:         MOV A,R3
  248.          MOV DELTY,A
  249.          RET
  250. BQTAB:         DB 80H,80H
  251. ;雙字節取補程序 /(R3R4)=(R3R4)
  252. ;入口: R3,R4
  253. ;占用資源: ACC
  254. ;堆棧需求: 2字節
  255. ;出口: R3,R4
  256. CMPT:         MOV A,R4
  257.          CPL A
  258.          ADD A,#01H
  259.          MOV R4,A
  260.          MOV A,R3
  261.          CPL A
  262.          ADDC A,#00H
  263.          MOV R3,A
  264.          RET
  265. ;N節取補程序 /([R0])=([R0])
  266. ;入口: R0,R7
  267. ;占用資源: ACC,B
  268. ;堆棧需求: 2字節
  269. ;出口: R0
  270. NCMPTN: MOV B,R0
  271.          SETB C
  272. NCPT1:         MOV A,@R0
  273.          CPL A
  274.          ADDC A,#00H
  275.          MOV @R0,A
  276.          INC R0
  277.          DJNZ R7,NCPT1
  278.          MOV R0,B
  279.          RET
  280. ;雙字節無符號數加法程序 (R3R4+R6R7)=(R3R4)
  281. ;入口: R3,R4,R6,R7
  282. ;占用資源: ACC
  283. ;堆棧需求: 2字節
  284. ;出口: R3,R4,CF
  285. NADD:         MOV A,R4
  286.          ADD A,R7
  287.          MOV R4,A
  288.          MOV A,R3
  289.          ADDC A,R6
  290.          MOV R3,A
  291.          RET
  292. ;N字節無符號數加法程序 ([R0]+[R1])=([R0])
  293. ;入口: R0,R1,R7
  294. ;占用資源: ACC,B
  295. ;堆棧需求: 2字節
  296. ;出口: R0,CF
  297. NADDN:         MOV B,R0
  298.          CLR C
  299. NADN1:         MOV A,@R0
  300.          ADDC A,@R1
  301.          MOV @R0,A
  302.          INC R0
  303.          INC R1
  304.          DJNZ R7,NADN1
  305.          MOV R0,B
  306.          RET
  307. ;雙字節無符號數減法程序 (R3R4-R6R7)=(R3R4)
  308. ;入口: R3,R4,R6,R7
  309. ;占用資源: ACC
  310. ;堆棧需求: 2字節
  311. ;出口: R3,R4
  312. NSUB:         MOV A,R4
  313.          CLR C
  314.          SUBB A,R7
  315.          MOV R4,A
  316.          MOV A,R3
  317.          SUBB A,R6
  318.          MOV R3,A
  319.          RET
  320. ;N字節無符號數減法程序 ([R0]-[R1])=([R0])
  321. ;入口: R0,R1,R7
  322. ;占用資源: ACC,B
  323. ;堆棧需求: 2字節
  324. ;出口: R0,CF
  325. NSUBN:         MOV B,R0
  326.          MOV R7,N
  327.          CLR C
  328. NSUBN1: MOV A,@R0
  329.          SUBB A,@R1
  330.          MOV @R0,A
  331.          INC R0
  332.          INC R1
  333.          DJNZ R7,NSUBN1
  334.          MOV R0,B
  335.          RET
  336. ;單字節無符號數乘法程序 (R3R4*R7)=(R2R3R4)
  337. ;入口: R3,R4,R7
  338. ;占用資源: ACC,B
  339. ;堆棧需求: 2字節
  340. ;出口: R2,R3,R4
  341. NMUL21: MOV A,R4
  342.          MOV B,R7
  343.          MUL AB
  344.          MOV R4,A
  345.          MOV A,B
  346.          XCH A,R3
  347.          MOV B,R7
  348.          MUL AB
  349.          ADD A,R3
  350.          MOV R3,A
  351.          CLR A
  352.          ADDC A,B
  353.          MOV R2,A
  354.          CLR OV
  355.          RET
  356. ;單字節無符號數乘法程序 (R2R3R4*R7)=(R5R2R3R4)
  357. ;入口: R2,R3,R4,R6,R7
  358. ;占用資源: ACC,B
  359. ;堆棧需求: 2字節
  360. ;出口: R5,R2,R3,R4
  361. NMUL31:        MOV A,R4
  362.         MOV B,R7
  363.          MUL AB
  364.          MOV R4,A
  365.          MOV A,B
  366.          XCH A,R3
  367.          MOV B,R7
  368.          MUL AB
  369.          ADD A,R3
  370.          MOV R3,A
  371.          CLR A
  372.          ADDC A,B
  373.          XCH A,R2
  374.          MOV B,R7
  375.          MUL AB
  376.          ADD A,R2
  377.          MOV R2,A
  378.          CLR A
  379.          ADDC A,B
  380.          MOV R5,A
  381.          CLR OV
  382.          RET
  383. ;單字節無符號數乘法程序 (R5R2R3R4*R7)=(R7R5R2R3R4)
  384. ;入口: R5,R2,R3,R4,R7
  385. ;占用資源: ACC,B
  386. ;堆棧需求: 2字節
  387. ;出口: R7,R5,R2,R3,R4
  388. NMUL41: MOV A,R4
  389.          MOV B,R7
  390.          MUL AB
  391.          MOV R4,A
  392.          MOV A,B
  393.          XCH A,R3
  394.          MOV B,R7
  395.          MUL AB
  396.          ADD A,R3
  397.          MOV R3,A
  398.          CLR A
  399.          ADDC A,B
  400.          XCH A,R2
  401.          MOV B,R7
  402.          MUL AB
  403.          ADD A,R2
  404.          MOV R2,A
  405.          CLR A
  406.          ADDC A,B
  407.          XCH A,R5
  408.          MOV B,R7
  409.          MUL AB
  410.          ADD A,R5
  411.          MOV R5,A
  412.          CLR A
  413.          ADDC A,B
  414.          MOV R7,A
  415.          CLR OV
  416.          RET
  417. ;雙字節無符號數乘法程序 (R3R4*R6R7)=(R5R2R3R4)
  418. ;入口: R3,R4,R6,R7
  419. ;占用資源: ACC,B
  420. ;堆棧需求: 2字節
  421. ;出口: R5,R2,R3,R4
  422. NMUL22: MOV A,R4
  423.          MOV B,R7
  424.          MUL AB
  425.          XCH A,R4
  426.          MOV R5,B
  427.          MOV B,R6
  428.         MUL AB
  429.          ADD A,R5
  430.          MOV R5,A
  431.          CLR A
  432.          ADDC A,B
  433.          MOV R2,A
  434.          MOV A,R3
  435.          MOV B,R7
  436.          MUL AB
  437.          ADD A,R5
  438.          MOV R5,A
  439.          MOV A,B
  440.          ADDC A,R2
  441.          MOV R2,A
  442.          CLR A
  443.          ADDC A,#00H
  444.          XCH A,R3
  445.          MOV B,R6
  446.          MUL AB
  447.          ADD A,R2
  448.          MOV R2,A
  449.          MOV A,B
  450.          ADDC A,R3
  451.          XCH A,R5
  452.          MOV R3,A
  453.          CLR OV
  454.          RET
  455. ;雙字節無符號數乘法程序 (R2R3R4*R6R7)=(R1R5R2R3R4)
  456. ;入口: R2,R3,R4,R6,R7
  457. ;占用資源: ACC,B
  458. ;堆棧需求: 2字節
  459. ;出口: R1,R5,R2,R3,R4
  460. NMUL32: MOV A,R4
  461.          MOV B,R7
  462.          MUL AB
  463.          XCH A,R4
  464.          MOV R5,B
  465.          MOV B,R6
  466.          MUL AB
  467.          ADD A,R5
  468.          MOV R5,A
  469.          CLR A
  470.          ADDC A,B
  471.          MOV R1,A
  472.          MOV A,R3
  473.          MOV B,R7
  474.         MUL AB
  475.          ADD A,R5
  476.          MOV R5,A
  477.          MOV A,B
  478.          ADDC A,R1
  479.          MOV R1,A
  480.          CLR A
  481.          ADDC A,#00H
  482.          XCH A,R3
  483.          MOV B,R6
  484.          MUL AB
  485.          ADD A,R1
  486.          MOV R1,A
  487.          MOV A,B
  488.          ADDC A,R3
  489.          XCH A,R5
  490.          MOV R3,A
  491.          MOV A,R2
  492.          MOV B,R7
  493.          MUL AB
  494.          ADD A,R1
  495.          MOV R1,A
  496.          MOV A,B
  497.          ADDC A,R5
  498.          MOV R5,A
  499.          CLR A
  500.          ADDC A,#00H
  501.          XCH A,R2
  502.          MOV B,R6
  503.          MUL AB
  504.          ADD A,R5
  505.          MOV R5,A
  506.          MOV A,B
  507.          ADDC A,R2
  508.          XCH A,R1
  509.          MOV R2,A
  510.          CLR OV
  511.          RET
  512. ;N字節無符號數乘法程序 ([R0]*[R1])=([R0])
  513. ;入口: R0,R1,M,N
  514. ;占用資源: ACC,B,R2,R5,R6,R7,NCNT
  515. ;堆棧需求: 2字節
  516. ;出口: R0
  517. NMULMN: MOV A,M
  518.          ADD A,R0
  519.          MOV R5,A
  520.         XCH A,R1
  521.          XCH A,R5
  522.          ADD A,N
  523.          XCH A,R0
  524.          MOV R6,A
  525.          MOV B,M
  526.          MOV NCNT,B
  527. NMLMN1: DEC R0
  528.          DEC R1
  529.          CLR A
  530.          XCH A,@R1
  531.          MOV @R0,A
  532.          DJNZ NCNT,NMLMN1
  533.          MOV NCNT,B
  534. NMLMN2: CLR A
  535.          XCH A,@R0
  536.          MOV R2,A
  537.          MOV A,R6
  538.          MOV R0,A
  539.          MOV A,R5
  540.          MOV R1,A
  541.          MOV R7,N
  542.          CLR C
  543. NMLMN3: MOV A,R2
  544.          MOV B,@R1
  545.          INC R1
  546.          MUL AB
  547.          ADDC A,@R0
  548.          MOV @R0,A
  549.          INC R0
  550.          MOV A,B
  551.          ADDC A,@R0
  552.          MOV @R0,A
  553.          DJNZ R7,NMLMN3
  554.          INC R0
  555.          INC R6
  556.          DJNZ NCNT,NMLMN2
  557.          MOV A,R0
  558.          CLR C
  559.          SUBB A,M
  560.          SUBB A,N
  561.          MOV R0,A
  562.          RET
  563. ;單字節無符號除法程序(除數為4bit,1~15) (R3R4/R7)=R3R4 余數R7
  564. ;入口: R3,R4,R7
  565. ;占用資源: ACC,B,F0
  566. ;堆棧需求: 2字節
  567. ;出口: R3,R4,R7,OV  
  568. NDIV24:        MOV A,R3         
  569.         MOV B,R7
  570.         DIV AB
  571.         MOV R3,A
  572.         MOV A,B
  573.         SWAP A
  574.         MOV B,A
  575.         MOV A,R4
  576.         ANL A,#0F0H
  577.         SWAP A
  578.         ORL A,B
  579.         MOV B,R7
  580.         DIV AB
  581.         SWAP A
  582.         PUSH ACC
  583.         MOV A,B
  584.         SWAP A
  585.         MOV B,A
  586.         MOV A,R4
  587.         ANL A,#0FH
  588.         ORL A,B
  589.         MOV B,R7
  590.         DIV AB
  591.         MOV R7,B
  592.         MOV B,A
  593.         POP ACC
  594.         ORL A,B
  595.         MOV R4,A
  596.         RET        
  597. ;單字節無符號除法程序 (R3R4/R7)=(R3)R4 余數R7
  598. ;入口: R3,R4,R7
  599. ;占用資源: ACC,B,F0
  600. ;堆棧需求: 2字節
  601. ;出口: (R3),R4,R7,OV         
  602. NDIV21: MOV A,R3
  603.          MOV B,R7
  604.          DIV AB
  605.          PUSH ACC
  606.          MOV R3,B
  607.          MOV B,#08H
  608. NDV211: CLR C
  609.          MOV A,R4
  610.          RLC A
  611.          MOV R4,A
  612.          MOV A,R3
  613.          RLC A
  614.          MOV R3,A  
  615.          MOV F0,C
  616.          CLR C
  617.          SUBB A,R7
  618.          JB F0,NDV212
  619.          JC NDV213
  620. NDV212: MOV R3,A
  621.          INC R4
  622. NDV213: DJNZ B,NDV211
  623.          POP ACC
  624.          CLR OV
  625.          JZ NDV214
  626.          SETB OV
  627. NDV214: XCH A,R3
  628.          MOV R7,A
  629.          RET
  630. ;單字節無符號除法程序 (R2R3R4/R7)=(R2)R3R4 余數R7
  631. ;入口: R2,R3,R4,R7
  632. ;占用資源: ACC,B,F0
  633. ;堆棧需求: 3字節
  634. ;出口: (R2),R3,R4,R7,OV
  635. NDIV31: MOV A,R2
  636.          MOV B,R7
  637.          DIV AB
  638.          PUSH ACC
  639.          MOV R2,B
  640.          MOV B,#10H
  641. NDV311: CLR C
  642.          MOV A,R4
  643.          RLC A
  644.          MOV R4,A
  645.          MOV A,R3
  646.          RLC A
  647.          MOV R3,A
  648.          MOV A,R2
  649.          RLC A
  650.          MOV R2,A
  651.          MOV F0,C
  652.          CLR C
  653.          SUBB A,R7
  654.          JB F0,NDV312
  655.          JC NDV313
  656. NDV312: MOV R2,A
  657.          INC R4
  658. NDV313: DJNZ B,NDV311
  659.          POP ACC
  660.          CLR OV
  661.          JZ NDV314
  662.          SETB OV
  663. NDV314: XCH A,R2
  664.          MOV R7,A
  665.          RET
  666. ;單字節無符號除法程序 (R5R2R3R4/R7)=(R5)R2R3R4 余數R7
  667. ;入口: R2,R3,R4,R7
  668. ;占用資源: ACC,B,F0
  669. ;堆棧需求: 3字節
  670. ;出口: (R5),R2,R3,R4,R7,OV
  671. NDIV41: MOV A,R5
  672.          MOV B,R7
  673.          DIV AB
  674.          PUSH ACC
  675.          MOV R5,B
  676.          MOV B,#18H
  677. NDV411: CLR C
  678.          MOV A,R4
  679.         RLC A
  680.          MOV R4,A
  681.          MOV A,R3
  682.          RLC A
  683.          MOV R3,A
  684.          MOV A,R2
  685.          RLC A
  686.          MOV R2,A
  687.          MOV A,R5
  688.          RLC A
  689.          MOV R5,A
  690.          MOV F0,C
  691.          CLR C
  692.          SUBB A,R7
  693.          JB F0,NDV412
  694.          JC NDV413
  695. NDV412: MOV R5,A
  696.          INC R4
  697. NDV413: DJNZ B,NDV411
  698.          POP ACC
  699.          CLR OV
  700.          JZ NDV414
  701.          SETB OV
  702. NDV414: XCH A,R5
  703.          MOV R7,A
  704.          RET
  705. ;雙字節無符號除法程序 (R5R2R3R4/R6R7)=(R2)R3R4 余數R6R7
  706. ;入口: R5,R2,R3,R4,R6,R7
  707. ;占用資源: ACC,B,F0
  708. ;堆棧需求: 4字節
  709. ;出口: (R2),R3,R4,R6,R7,OV
  710. NDIV42 : MOV A,R1
  711. PUSH ACC
  712. MOV B,#00H
  713. NDV421 : MOV A,R2
  714. CLR C
  715. SUBB A,R7
  716. MOV R1,A
  717. MOV A,R5
  718. SUBB A,R6
  719. JC NDV422
  720. MOV R5,A
  721. MOV A,R1
  722. MOV R2,A
  723. INC B
  724. SJMP NDV421
  725. NDV422 : PUSH B
  726. MOV B,#10H
  727. NDV423 : CLR C
  728. MOV A,R4
  729. RLC A
  730. MOV R4,A
  731. MOV A,R3
  732. RLC A
  733. MOV R3,A
  734. MOV A,R2
  735. RLC A
  736. MOV R2,A
  737. XCH A,R5
  738. RLC A
  739. XCH A,R5
  740. MOV F0,C
  741. CLR C
  742. SUBB A,R7
  743. MOV R1,A
  744. MOV A,R5
  745. SUBB A,R6
  746. JB F0,NCV424
  747. JC NDV425
  748. NCV424 : MOV R5,A
  749. MOV A,R1
  750. MOV R2,A
  751. INC R4
  752. NDV425 : DJNZ B,NDV423
  753. POP ACC
  754. CLR OV
  755. JNZ NDV426
  756. SETB OV
  757. NDV426 : XCH A,R2
  758. MOV R7,A
  759. MOV A,R5
  760. MOV R6,A
  761. POP ACC
  762. MOV R1,A
  763. RET
  764. ;N字節無符號除法程序(組合) ([R0]/[R1])=([R0])
  765. ;入口: R0,R1,M,N
  766. ;占用資源: ACC,R2,R3,R4,R5,R7,NCNT,F0,NADDN,NSUBBN,NRLCN
  767. ;堆棧需求: 4字節
  768. ;出口: R0
  769. NDIVMN : MOV A,M
  770. CLR C
  771. SUBB A,N
  772. MOV NCNT,A
  773. ADD A,R0
  774. MOV R4,A
  775. XCH A,R0
  776. MOV R3,A
  777. MOV A,R1
  778. MOV R5,A
  779. MOV R2,#00H
  780. NDVMN1 : MOV R7,N
  781. LCALL NSUBN
  782. MOV A,R5
  783. MOV R1,A
  784. JC NDVMN2
  785. INC R2
  786. SJMP NDVMN1
  787. NDVMN2 : MOV R7,N
  788. LCALL NADDN
  789. MOV A,NCNT
  790. SWAP A
  791. RR A
  792. MOV NCNT,A
  793. NDVMN3 : MOV A,R3
  794. MOV R0,A
  795. MOV R7,M
  796. LCALL NRLCN
  797. MOV F0,C
  798. MOV A,R4
  799. MOV R0,A
  800. MOV A,R5
  801. MOV R1,A
  802. MOV R7,N
  803. LCALL NSUBN
  804. JB F0,NDVMN4
  805. JC NDVMN5
  806. NDVMN4 : MOV A,R3
  807. MOV R0,A
  808. INC @R0
  809. SJMP NDVMN6
  810. NDVMN5 : MOV A,R5
  811. MOV R1,A
  812. MOV R7,N
  813. LCALL NADDN
  814. NDVMN6 : DJNZ NCNT,NDVMN3
  815. MOV A,R4
  816. MOV R1,A
  817. MOV A,R2
  818. MOV @R1,A
  819. MOV A,R3
  820. MOV R0,A
  821. RET
  822. ;N字節無符號除法程序(集成) ([R0]/R[1])=([R0])
  823. ;入口: R0,R1,M,N
  824. ;占用資源: ACC,R2,R3,R4,R5,R7,F0
  825. ;堆棧需求: 2字節
  826. ;出口: R0
  827. NDIVMN : MOV A,M
  828. CLR C
  829. SUBB A,N
  830. MOV B,A
  831. ADD A,R0
  832. MOV R4,A
  833. XCH A,R0
  834. MOV R3,A
  835. MOV A,R1
  836. MOV R5,A
  837. MOV R2,#00H
  838. NDVMN1 : MOV R7,N
  839. CLR C
  840. NDVMN2 : MOV A,@R0
  841. SUBB A,@R1
  842. MOV @R0,A
  843. INC R0
  844. INC R1
  845. DJNZ R7,NDVMN2
  846. MOV A,R4
  847. MOV R0,A
  848. MOV A,R5
  849. MOV R1,A
  850. JC NDVMN3
  851. INC R2
  852. SJMP NDVMN1
  853. NDVMN3 : MOV R7,N
  854. CLR C
  855. NDVMN4 : MOV A,@R0
  856. ADDC A,@R1
  857. MOV @R0,A
  858. INC R0
  859. INC R1
  860. DJNZ R7,NDVMN4
  861. MOV A,#08H
  862. MUL AB
  863. MOV B,A
  864. NDVMN5 : MOV A,R3
  865. MOV R0,A
  866. MOV R7,M
  867. CLR C
  868. NDVMN6 : MOV A,@R0
  869. RLC A
  870. MOV @R0,A
  871. INC R0
  872. DJNZ R7,NDVMN6
  873. MOV F0,C
  874. MOV A,R4
  875. MOV R0,A
  876. MOV A,R5
  877. MOV R1,A
  878. MOV R7,N
  879. CLR C
  880. NDVMN7 : MOV A,@R0
  881. SUBB A,@R1
  882. MOV @R0,A
  883. INC R0
  884. INC R1
  885. DJNZ R7,NDVMN7
  886. JB F0,NDVMNB
  887. JC NDVMN8
  888. NDVMNB : MOV A,R3
  889. MOV R0,A
  890. INC @R0
  891. SJMP NDVMNA
  892. NDVMN8 : MOV R7,N
  893. MOV A,R4
  894. MOV R0,A
  895. MOV A,R5
  896. MOV R1,A
  897. CLR C
  898. NDVMN9 : MOV A,@R0
  899. ADDC A,@R1
  900. MOV @R0,A
  901. INC R0
  902. INC R1
  903. DJNZ R7,NDVMN9
  904. NDVMNA : DJNZ B,NDVMN5
  905. MOV A,M
  906. CLR C
  907. SUBB A,N
  908. ADD A,R3
  909. MOV R1,A
  910. MOV A,R2
  911. MOV @R1,A
  912. MOV A,R3
  913. MOV R0,A
  914. RET
  915. ;N字節數據左移程序 RLC([R0])=(CF[R0])
  916. ;入口: R0,R7
  917. ;占用資源: ACC,B
  918. ;堆棧需求: 2字節
  919. ;出口: R0,CF
  920. NRLCN: MOV B,R0
  921. CLR C
  922. NRLN1: MOV A,@R0
  923. RLC A
  924. MOV @R0,A
  925. INC R0
  926. DJNZ R7,NRLN1
  927. MOV R0,B
  928. RET
  929. ;原碼有符號雙字節減法程序 (R3R4-R6R7)=R3R4
  930. ;入口: R3,R4,R6,R7
  931. ;占用資源: ACC,DADD
  932. ;堆棧需求: 6字節
  933. ;出口: R3,R4,OV
  934. DSUB : MOV A,R6
  935. CPL ACC.7
  936. MOV R6,A
  937. LCALL DADD
  938. RET
  939. ;原碼有符號雙字節加法程序 (R3R4+R6R7)=R3R4
  940. ;入口: R3,R4,R6,R7
  941. ;占用資源: ACC,SR0,NADD,NSUB,CMPT
  942. ;堆棧需求: 4字節
  943. ;出口: R3,R4,OV
  944. DADD : MOV A,R3
  945. MOV C,ACC.7
  946. MOV SR0,C
  947. XRL A,R6
  948. MOV C,ACC.7
  949. MOV A,R3
  950. CLR ACC.7
  951. MOV R3,A
  952. MOV A,R6
  953. CLR ACC.7
  954. MOV R6,A
  955. JC DAB2
  956. LCALL NADD
  957. MOV A,R3
  958. JB ACC.7,DABE
  959. DAB1 : MOV C,SR0
  960. MOV ACC.7,C
  961. MOV R3,A
  962. CLR OV
  963. RET
  964. DABE : SETB OV
  965. RET
  966. DAB2 : LCALL NSUB
  967. MOV A,R3
  968. JNB ACC.7,DAB1
  969. LCALL CMPT
  970. CPL SR0
  971. SJMP DAB1
  972. ;原碼有符號雙字節乘法程序 (R3R4*R6R7)=(R5R2R3R4)
  973. ;入口: R3,R4,R6,R7
  974. ;占用資源: ACC,SR0,NMUL22
  975. ;堆棧需求: 4字節
  976. ;出口: R5,R2,R3,R4
  977. IMUL : MOV A,R3
  978. XRL A,R6
  979. MOV C,ACC.7
  980. MOV SR0,C
  981. MOV A,R3
  982. CLR ACC.7
  983. MOV R3,A
  984. MOV A,R6
  985. CLR ACC.7
  986. MOV R6,A
  987. LCALL NMUL22
  988. MOV A,R5
  989. MOV C,SR0
  990. MOV ACC.7,C
  991. MOV R5,A
  992. RET
  993. ;原碼有符號雙字節除法程序 (R5R2R3R4/R6R7)=(R3R4) 余數(R6R7)
  994. ;入口: R5,R2,R3,R4
  995. ;占用資源: ACC,SR0,NDIV42
  996. ;堆棧需求: 6字節
  997. ;出口: R3,R4,R6,R7,OV
  998. IDIV : MOV A,R5
  999. XRL A,R6
  1000. MOV C,ACC.7
  1001. MOV SR0,C
  1002. MOV A,R5
  1003. CLR ACC.7
  1004. MOV R5,A
  1005. MOV A,R6
  1006. CLR ACC.7
  1007. MOV R6,A
  1008. LCALL NDIV42
  1009. MOV A,R3
  1010. JB ACC.7,IDIVE
  1011. JB OV,IDIVE
  1012. MOV C,SR0
  1013. MOV ACC.7,C
  1014. MOV R3,A
  1015. RET
  1016. IDIVE: SETB OV
  1017. RET
  1018. ;單字節順序查找程序
  1019. ;入口: R0,R1,A,R7
  1020. ;占用資源: B
  1021. ;堆棧需求: 2字節
  1022. ;出口: R0,R1,A
  1023. FINDB1 : MOV B,A
  1024. MOV DPL,R1
  1025. MOV DPH,R0
  1026. FINDB11 : MOVX A,@DPTR
  1027. CJNE A,B,FINDB12
  1028. MOV R1,DPL
  1029. MOV R0,DPH
  1030. CLR A
  1031. RET
  1032. FINDB12 : INC DPTR
  1033. DJNZ R7,FINDB11
  1034. MOV A,#0FFH
  1035. RET
  1036. ;單字節順序查找程序
  1037. ;入口: R0,R1,A,R6,R7
  1038. ;占用資源: B
  1039. ;堆棧需求: 2字節
  1040. ;出口: R0,R1,A
  1041. FINDB2 : MOV B,A
  1042. MOV DPL,R1
  1043. MOV DPH,R0
  1044. MOV A,R7
  1045. JZ FINDB21
  1046. INC R6
  1047. FINDB21 : MOVX A,@DPTR
  1048. CJNE A,B,FINDB22
  1049. MOV R1,DPL
  1050. MOV R0,DPH
  1051. CLR A
  1052. RET
  1053. FINDB22 : INC DPTR
  1054. DJNZ R7,FINDB21
  1055. DJNZ R6,FINDB21
  1056. MOV A,#0FFH
  1057. RET
  1058. ;雙字節字符串順序查找程序
  1059. ;入口: R0,R1,R3,R4,R7
  1060. ;占用資源: ACC,B
  1061. ;堆棧需求: 2字節
  1062. ;出口: R0,R1,A
  1063. FINDS1 : MOV DPL,R1
  1064. MOV DPH,R0
  1065. FINDS11 : MOVX A,@DPTR
  1066. INC DPTR
  1067. CLR C
  1068. SUBB A,R4
  1069. JNZ FINDS12
  1070. MOVX A,@DPTR
  1071. SUBB A,R3
  1072. JNZ FINDS12
  1073. MOV A,DPL
  1074. CLR C
  1075. SUBB A,#01H
  1076. MOV R1,A
  1077. MOV A,DPH
  1078. SUBB A,#00H
  1079. MOV R0,A
  1080. CLR A
  1081. RET
  1082. FINDS12 : DJNZ R7,FINDS11
  1083. MOV A,#0FFH
  1084. RET
  1085. ;雙字節字符串順序查找程序
  1086. ;入口: R0,R1,R3,R4,R6,R7
  1087. ;占用資源: ACC,B
  1088. ;堆棧需求: 2字節
  1089. ;出口: R0,R1,A
  1090. FINDS2 : MOV DPL,R1
  1091. MOV DPH,R0
  1092. MOV A,R7
  1093. JZ FINDS21
  1094. INC R6
  1095. FINDS21 : MOVX A,@DPTR
  1096. INC DPTR
  1097. CLR C
  1098. SUBB A,R4
  1099. JNZ FINDS22
  1100. MOVX A,@DPTR
  1101. SUBB A,R3
  1102. JNZ FINDS22
  1103. MOV A,DPL
  1104. CLR C
  1105. SUBB A,#01H
  1106. MOV R1,A
  1107. MOV A,DPH
  1108. SUBB A,#00H
  1109. MOV R0,A
  1110. CLR A
  1111. RET
  1112. FINDS22 : DJNZ R7,FINDS21
  1113. DJNZ R6,FINDS21
  1114. MOV A,#0FFH
  1115. RET
  1116. ;N字節字符串順序查找程序
  1117. ;入口: ADDPH,ADDPL,R0,R6,R7,N
  1118. ;占用資源: ACC,B,R2,NCNT
  1119. ;堆棧需求: 2字節
  1120. ;出口: ADDPH,ADDPL,A
  1121. FINDN: MOV A,R0
  1122. MOV R2,A
  1123. MOV A,ADDPL
  1124. MOV DPL,A
  1125. MOV A,ADDPH
  1126. MOV DPH,A
  1127. MOV A,R7
  1128. JZ FINDN1
  1129. INC R6
  1130. FINDN1 : MOV A,R2
  1131. MOV R0,A
  1132. MOV A,N
  1133. MOV NCNT,A
  1134. FINDN2 : MOVX A,@DPTR
  1135. CLR C
  1136. SUBB A,@R0
  1137. JNZ FINDN3
  1138. INC DPTR
  1139. INC R0
  1140. DJNZ NCNT,FINDN2
  1141. MOV A,DPL
  1142. CLR C
  1143. SUBB A,N
  1144. MOV ADDPL,A
  1145. MOV A,DPH
  1146. SUBB A,#00H
  1147. MOV ADDPH,A
  1148. CLR A
  1149. RET
  1150. FINDN3 : CLR C
  1151. MOV A,R0
  1152. SUBB A,R2
  1153. JNZ FINDN4
  1154. INC DPTR
  1155. FINDN4 : DJNZ R7,FINDN1
  1156. DJNZ R6,FINDN1
  1157. MOV A,#0FFH
  1158. RET
  1159. ;單字節最值查找程序
  1160. ;入口: R0,R1,R6,R7
  1161. ;占用資源: ACC,B
  1162. ;堆棧需求: 2字節
  1163. ;出口: R0(最大值),R1(最小值),R2,R3,R4,R5
  1164. FMAMIB : MOV DPL,R1
  1165. MOV DPH,R0
  1166. MOVX A,@DPTR
  1167. MOV R0,A
  1168. MOV R1,A
  1169. MOV A,DPL
  1170. MOV R3,A
  1171. MOV R5,A
  1172. MOV A,DPH
  1173. MOV R2,A
  1174. MOV R4,A
  1175. MOV A,R7
  1176. JZ FMMB1
  1177. INC R6
  1178. FMMB1: MOVX A,@DPTR
  1179. MOV B,A
  1180. SETB C
  1181. SUBB A,R0
  1182. JC FMMB2
  1183. MOV R0,B
  1184. MOV R3,DPL
  1185. MOV R2,DPH
  1186. SJMP FMMB3
  1187. FMMB2: MOV A,B
  1188. CLR C
  1189. SUBB A,R1
  1190. JNC FMMB3
  1191. MOV R1,B
  1192. MOV R5,DPL
  1193. MOV R4,DPH
  1194. FMMB3: INC DPTR
  1195. DJNZ R7,FMMB1
  1196. DJNZ R6,FMMB1
  1197. RET
  1198. ;浮點數順序查找程序
  1199. ;入口: R0,R1,R2,R3,R4,R6,R7
  1200. ;占用資源: B,NCNT,FCMP
  1201. ;堆棧需求: 2字節
  1202. ;出口: R0,R1,A
  1203. FINDF: MOV DPL,R1
  1204. MOV DPH,R0
  1205. MOV A,R7
  1206. MOV B,A
  1207. MOV NCNT,R6
  1208. JZ FINDF1
  1209. INC NCNT
  1210. FINDF1 : MOVX A,@DPTR
  1211. INC DPTR
  1212. MOV R5,A
  1213. MOVX A,@DPTR
  1214. INC DPTR
  1215. MOV R6,A
  1216. MOVX A,@DPTR
  1217. INC DPTR
  1218. MOV R7,A
  1219. LCALL FCMP
  1220. JNZ FINDF2
  1221. MOV A,DPL
  1222. CLR C
  1223. SUBB A,#03H
  1224. MOV R1,A
  1225. MOV A,DPH
  1226. SUBB A,#00H
  1227. MOV R0,A
  1228. CLR A
  1229. RET
  1230. FINDF2 : DJNZ B,FINDF1
  1231. DJNZ NCNT,FINDF1
  1232. MOV A,#0FFH
  1233. RET
  1234. ;浮點數最值查找程序
  1235. ;入口: ADDPH,ADDPL,R6,R7
  1236. ;占用資源: ACC,B,NCNT,ITEMOV,EBMOV,MOVB,MOVR1,FCMP
  1237. ;堆棧需求: 5字節
  1238. ;出口: [R0](最大值),[R1](最小值),R2,R3,R4,R5
  1239. FMAMIF : MOV A,ADDPL
  1240. MOV R3,A
  1241. MOV R5,A
  1242. MOV DPL,A
  1243. MOV A,ADDPH
  1244. MOV R2,A
  1245. MOV R4,A
  1246. MOV DPH,A
  1247. MOV B,R7
  1248. MOV R7,#03H
  1249. LCALL ITEMOV
  1250. MOV R7,#03H
  1251. LCALL IBMOV
  1252. MOV A,B
  1253. JZ FMMF1
  1254. INC NCNT
  1255. FMMF1: PUSH B
  1256. MOVX A,@DPTR
  1257. INC DPTR
  1258. MOV R2,A
  1259. MOVX A,@DPTR
  1260. INC DPTR
  1261. MOV R3,A
  1262. MOVX A,@DPTR
  1263. INC DPTR
  1264. MOV R4,A
  1265. LCALL MOVR1
  1266. LCALL FCMP
  1267. JNC FMMF2
  1268. MOV A,R0
  1269. XCH A,R1
  1270. MOV R0,A
  1271. LCALL MOVB
  1272. MOV R5,DPL
  1273. MOV R4,DPH
  1274. MOV A,R0
  1275. XCH A,R1
  1276. MOV R0,A
  1277. SJMP FMMF3
  1278. FMMF2: MOV A,R0
  1279. XCH A,R1
  1280. MOV R0,A
  1281. LCALL MOVR1
  1282. LCALL FCMP
  1283. MOV A,R0
  1284. XCH A,R1
  1285. MOV R0,A
  1286. JZ FMMF3
  1287. JC FMMF3
  1288. LCALL MOVB
  1289. MOV R3,DPL
  1290. MOV R2,DPH
  1291. FMMF3: POP B
  1292. DJNZ B,FMMF1
  1293. DJNZ NCNT,FMMF1
  1294. RET
  1295. ;單字節折半查找程序
  1296. ;入口: A,R0,R1,R6,R7
  1297. ;占用資源: B,R2
  1298. ;堆棧需求: 2字節
  1299. ;出口: R0,R1
  1300. SEARCHB : MOV B,A
  1301. MOV A,R1
  1302. ADD A,R7
  1303. MOV R7,A
  1304. MOV A,R0
  1305. ADDC A,R6
  1306. MOV R6,A
  1307. MOV A,R7
  1308. SUBB A,#01H
  1309. MOV R7,A
  1310. JNC SECH1
  1311. DEC R6
  1312. SECH1: MOV A,R7
  1313. CLR C
  1314. SUBB A,R1
  1315. MOV A,R6
  1316. SUBB A,R0
  1317. JNC SECH2
  1318. MOV A,#0FFH
  1319. RET
  1320. SECH2: MOV A,R7
  1321. ADD A,R1
  1322. MOV R2,A
  1323. MOV A,R6
  1324. ADDC A,R0
  1325. RRC A
  1326. MOV DPH,A
  1327. MOV A,R2
  1328. RRC A
  1329. MOV DPL,A
  1330. MOVX A,@DPTR
  1331. CLR C
  1332. SUBB A,B
  1333. JNC SECH3
  1334. INC DPTR
  1335. MOV R0,DPH
  1336. MOV R1,DPL
  1337. SJMP SECH1
  1338. SECH3: JZ SECH5
  1339. MOV A,DPL
  1340. SUBB A,#01H
  1341. MOV R7,A
  1342. JNC SECH4
  1343. MOV R6,DPH
  1344. DEC R6
  1345. SECH4: SJMP SECH1
  1346. SECH5: MOV R0,DPH
  1347. MOV R1,DPL
  1348. CLR A
  1349. RET
  1350. ;辛普生積分程序
  1351. ;入口: DPTR,N,COUNT
  1352. ;占用資源: ACC,R3,R4,R6,R7
  1353. ;堆棧需求: 2字節
  1354. ;出口: R3,R4
  1355. SJF : MOV R7,N
  1356. MOVX A,@DPTR
  1357. INC DPTR
  1358. MOV R4,A
  1359. MOV R3,#00H
  1360. DEC R7
  1361. SJF1 : MOVX A,@DPTR
  1362. INC DPTR
  1363. CLR C
  1364. RLC A
  1365. MOV R6,A
  1366. CLR A
  1367. RLC A
  1368. XCH A,R7
  1369. JNB ACC.0,SJF2
  1370. XCH A,R6
  1371. RLC A
  1372. XCH A,R6
  1373. XCH A,R7
  1374. RLC A
  1375. XCH A,R7
  1376. SJF2 : XCH A,R7
  1377. XCH A,R6
  1378. ADD A,R4
  1379. MOV R4,A
  1380. MOV A,R6
  1381. ADDC A,R3
  1382. MOV R3,A
  1383. DJNZ R7,SJF1
  1384. SJF3 : MOVX A,@DPTR
  1385. ADD A,R4
  1386. MOV R4,A
  1387. CLR A
  1388. ADDC A,R3
  1389. MOV R3,A
  1390. MOV R7,#COUNT
  1391. LCALL NMUL21
  1392. MOV A,N
  1393. MOV B,#03H
  1394. MUL AB
  1395. MOV R7,A
  1396. LCALL NDIV31
  1397. RET
  1398. ;內部RAM數據排序程序(升序)
  1399. ;入口: R0(起始地址),N(數據個數)
  1400. ;占用資源: ACC,B,R5,R6,R7
  1401. ;堆棧需求: 2字節
  1402. ;出口: R0
  1403. ISELSORT : MOV R7,N
  1404. DEC R7
  1405. ISST1: MOV A,R7
  1406. MOV R6,A
  1407. MOV A,R0
  1408. MOV R1,A
  1409. MOV R2,A
  1410. MOV B,@R1
  1411. ISST2: INC R1
  1412. MOV A,@R1
  1413. CLR C
  1414. SUBB A,B
  1415. JC ISST3
  1416. MOV A,R1
  1417. MOV R2,A
  1418. MOV B,@R1
  1419. ISST3: DJNZ R6,ISST2
  1420. MOV A,B
  1421. XCH A,@R1
  1422. MOV B,R2
  1423. MOV R1,B
  1424. MOV @R1,A
  1425. DJNZ R7,ISST1
  1426. RET
  1427. ;外部RAM數據排序程序(升序)
  1428. ;入口: ADDPH,ADDPL(起始地址),N(數據個數)
  1429. ;占用資源: ACC,B,R0,R1,R5,R7
  1430. ;堆棧需求: 2字節
  1431. ;出口: ADDPH-ADDPL
  1432. ESELSORT : MOV R7,N
  1433. DEC R7
  1434. ESST1: MOV A,R7
  1435. MOV R6,A
  1436. MOV DPL,ADDPL
  1437. MOV R1,DPL
  1438. MOV DPH,ADDPH
  1439. MOV R0,DPH
  1440. MOVX A,@DPTR
  1441. MOV B,A
  1442. ESST2: INC DPTR
  1443. MOVX A,@DPTR
  1444. CLR C
  1445. SUBB A,B
  1446. JC ESST3
  1447. MOV R0,DPL
  1448. MOV R1,DPH
  1449. MOVX A,@DPTR
  1450. MOV B,A
  1451. ESST3: DJNZ R6,ESST2
  1452. MOVX A,@DPTR
  1453. XCH A,B
  1454. MOVX @DPTR,A
  1455. MOV DPL,R0
  1456. MOV DPH,R1
  1457. MOV A,B
  1458. MOVX @DPTR,A
  1459. DJNZ R7,ESST1
  1460. RET
  1461. ;外部RAM浮點數排序程序(升序)
  1462. ;入口: ADDPH,ADDPL(起始地址),N(數據個數)
  1463. ;占用資源: ACC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT
  1464. ;堆棧需求: 5字節
  1465. ;出口: ADDPH,ADDPL
  1466. FSORT: MOV A,N
  1467. MOV NCNT,A
  1468. DEC NCNT
  1469. FST1 : MOV B,NCNT
  1470. MOV DPL,ADDPL
  1471. MOV R1,DPL
  1472. MOV DPH,ADDPH
  1473. MOV R0,DPH
  1474. MOVX A,@DPTR
  1475. MOV R2,A
  1476. INC DPTR
  1477. MOVX A,@DPTR
  1478. MOV R3,A
  1479. INC DPTR
  1480. MOVX A,@DPTR
  1481. MOV R4,A
  1482. FST2 : INC DPTR
  1483. MOVX A,@DPTR
  1484. MOV R5,A
  1485. INC DPTR
  1486. MOVX A,@DPTR
  1487. MOV R6,A
  1488. INC DPTR
  1489. MOVX A,@DPTR
  1490. MOV R7,A
  1491. PUSH B
  1492. LCALL FCMP
  1493. POP B
  1494. JNC FST4
  1495. MOV A,DPL
  1496. CLR C
  1497. SUBB A,#02H
  1498. MOV R1,A
  1499. MOV R0,DPH
  1500. JNC FST3
  1501. DEC R0
  1502. FST3 : MOV A,R5
  1503. MOV R2,A
  1504. MOV A,R6
  1505. MOV R3,A
  1506. MOV A,R7
  1507. MOV R4,A
  1508. FST4 : DJNZ B,FST2
  1509. MOV A,DPL
  1510. CLR C
  1511. SUBB A,#02H
  1512. MOV DPL,A
  1513. JNC FST5
  1514. DEC DPH
  1515. FST5 : MOV A,R2
  1516. MOVX @DPTR,A
  1517. INC DPTR
  1518. MOV A,R3
  1519. MOVX @DPTR,A
  1520. INC DPTR
  1521. MOV A,R4
  1522. MOVX @DPTR,A
  1523. MOV A,R0
  1524. MOV P2,A
  1525. MOV A,R5
  1526. MOVX @R1,A
  1527. INC R1
  1528. MOV A,R6
  1529. MOVX @R1,A
  1530. INC R1
  1531. MOV A,R7
  1532. MOVX @R1,A
  1533. DJNZ NCNT,FST1
  1534. RET
  1535. ;BCD小數轉換為二進制小數(2位)
  1536. ;入口: R0(低位首址),R7
  1537. ;占用資源: ACC,B,R5
  1538. ;堆棧需求: 2字節
  1539. ;出口: R3,R4
  1540. PDTB : CLR A
  1541. MOV R3,A
  1542. MOV R4,A
  1543. PDB1 : MOV A,R3
  1544. MOV B,#9AH
  1545. MUL AB
  1546. MOV R5,B
  1547. XCH A,R4
  1548. MOV B,#19H
  1549. MUL AB
  1550. ADD A,R4
  1551. MOV A,R5
  1552. ADDC A,B
  1553. MOV R5,A
  1554. MOV A,@R0
  1555. MOV B,#9AH
  1556. MUL AB
  1557. ADD A,R5
  1558. MOV R4,A
  1559. CLR A
  1560. ADDC A,B
  1561. XCH A,R3
  1562. MOV B,#19H
  1563. MUL AB
  1564. ADD A,R4
  1565. MOV R4,A
  1566. MOV A,B
  1567. ADDC A,R3
  1568. MOV R3,A
  1569. MOV A,@R0
  1570. MOV B,#19H
  1571. MUL AB
  1572. ADD A,R3
  1573. MOV R3,A
  1574. DEC R0
  1575. DJNZ R7,PDB1
  1576. RET
  1577. ;BCD小數轉換為二進制小數(N位)
  1578. ;入口: R1(低位首址),M,N
  1579. ;占用資源: ACC,B,R2,R3,R7
  1580. ;堆棧需求: 2字節
  1581. ;出口: R0
  1582. PDTBMN : MOV A,R0
  1583. MOV R2,A
  1584. MOV A,R1
  1585. MOV R3,A
  1586. MOV B,N
  1587. CLR A
  1588. PDBMN1 : MOV @R0,A
  1589. INC R0
  1590. DJNZ B,PDBMN1
  1591. MOV A,N
  1592. SWAP A
  1593. RR A
  1594. MOV R7,A
  1595. PDBMN2 : MOV A,R2
  1596. MOV R0,A
  1597. MOV A,R3
  1598. MOV R1,A
  1599. MOV B,M
  1600. CLR C
  1601. PDBMN3 : MOV A,@R1
  1602. ADDC A,@R1
  1603. DA A
  1604. JNB ACC.4,PDBMN4
  1605. SETB C
  1606. CLR ACC.4
  1607. PDBMN4 : MOV @R1,A
  1608. INC R1
  1609. DJNZ B,PDBMN3
  1610. MOV B,N
  1611. PDBMN5 : MOV A,@R0
  1612. RLC A
  1613. MOV @R0,A
  1614. INC R0
  1615. DJNZ B,PDBMN5
  1616. DJNZ R7,PDBMN2
  1617. MOV A,R2
  1618. MOV R0,A
  1619. RET
  1620. ;BCD整數轉換為二進制整數(1位)
  1621. ;入口: R0(高位地址),R7
  1622. ;占用資源: ACC,B
  1623. ;堆棧需求: 2字節
  1624. ;出口: R4
  1625. IDTB1: CLR A
  1626. MOV R4,A
  1627. IDB11: MOV A,R4
  1628. MOV B,#0AH
  1629. MUL AB
  1630. ADD A,@R0
  1631. INC R0
  1632. MOV R4,A
  1633. DJNZ R7,IDB11
  1634. RET
  1635. ;BCD整數轉換為二進制整數(2位)
  1636. ;入口: R0(高位地址),R7
  1637. ;占用資源: ACC,B
  1638. ;堆棧需求: 2字節
  1639. ;出口: R3,R4
  1640. IDTB2: CLR A
  1641. MOV R3,A
  1642. MOV R4,A
  1643. IDB21: MOV A,R4
  1644. MOV B,#0AH
  1645. MUL AB
  1646. MOV R4,A
  1647. MOV A,B
  1648. XCH A,R3
  1649. MOV B,#0AH
  1650. MUL AB
  1651. ADD A,R3
  1652. MOV R3,A
  1653. MOV A,R4
  1654. ADD A,@R0
  1655. INC R0
  1656. MOV R4,A
  1657. CLR A
  1658. ADDC A,R3
  1659. MOV R3,A
  1660. DJNZ R7,IDB21
  1661. RET
  1662. ;BCD整數轉換為二進制整數(3位)
  1663. ;入口: R0(高位地址),R7
  1664. ;占用資源: ACC,B
  1665. ;堆棧需求: 2字節
  1666. ;出口: R2,R3,R4
  1667. IDTB3: CLR A
  1668. MOV R2,A
  1669. MOV R3,A
  1670. MOV R4,A
  1671. IDB31: MOV A,R4
  1672. MOV B,#0AH
  1673. MUL AB
  1674. MOV R4,A
  1675. MOV A,B
  1676. XCH A,R3
  1677. MOV B,#0AH
  1678. MUL AB
  1679. ADD A,R3
  1680. MOV R3,A
  1681. CLR A
  1682. ADDC A,B
  1683. XCH A,R2
  1684. MOV B,#0AH
  1685. MUL AB
  1686. ADD A,R2
  1687. MOV R2,A
  1688. MOV A,R4
  1689. ADD A,@R0
  1690. INC R0
  1691. MOV R4,A
  1692. CLR A
  1693. ADDC A,R3
  1694. MOV R3,A
  1695. CLR A
  1696. ADDC A,R2
  1697. MOV R2,A
  1698. DJNZ R7,IDB31
  1699. RET
  1700. ;BCD整數轉換為二進制整數(N位)
  1701. ;入口: R1(高位地址),M,N
  1702. ;占用資源: ACC,B,R2,R7,NCNT,F0
  1703. ;堆棧需求: 2字節
  1704. ;出口: R0
  1705. IDTBMN : MOV A,R0
  1706. MOV R2,A
  1707. MOV B,N
  1708. CLR A
  1709. IDBMN1 : MOV @R0,A
  1710. INC R0
  1711. DJNZ B,IDBMN1
  1712. MOV A,R2
  1713. MOV R0,A
  1714. MOV A,M
  1715. MOV NCNT,A
  1716. IDBMN2 : MOV R7,N
  1717. CLR A
  1718. CLR F0
  1719. IDBMN3 : XCH A,@R0
  1720. MOV B,#0AH
  1721. MUL AB
  1722. MOV C,F0
  1723. ADDC A,@R0
  1724. MOV F0,C
  1725. MOV @R0,A
  1726. INC R0
  1727. MOV A,B
  1728. DJNZ R7,IDBMN3
  1729. MOV A,R2
  1730. MOV R0,A
  1731. MOV A,@R1
  1732. INC R1
  1733. ADD A,@R0
  1734. MOV @R0,A
  1735. DJNZ NCNT,IDBMN2
  1736. RET
  1737. ;二進制小數(2位)轉換為十進制小數(分離BCD碼)
  1738. ;入口: R3,R4,R7
  1739. ;占用資源: ACC,B
  1740. ;堆棧需求: 3字節
  1741. ;出口: R0
  1742. PBTD : MOV A,R7
  1743. PUSH ACC
  1744. PBD1 : MOV A,R4
  1745. MOV B,#0AH
  1746. MUL AB
  1747. MOV R4,A
  1748. MOV A,B
  1749. XCH A,R3
  1750. MOV B,#0AH
  1751. MUL AB
  1752. ADD A,R3
  1753. MOV R3,A
  1754. CLR A
  1755. ADDC A,B
  1756. MOV @R0,A
  1757. INC R0
  1758. DJNZ R7,PBD1
  1759. POP ACC
  1760. MOV R7,A
  1761. MOV A,R0
  1762. CLR C
  1763. SUBB A,R7
  1764. MOV R0,A
  1765. RET
  1766. ;二進制小數(M位)轉換為十進制小數(分離BCD碼)
  1767. ;入口: R1,M,N
  1768. ;占用資源: ACC,B,R2,R3,R7,NCNT
  1769. ;堆棧需求: 2字節
  1770. ;出口: R0
  1771. PBTDMN : MOV A,R0
  1772. MOV R2,A
  1773. MOV A,R1
  1774. MOV R3,A
  1775. MOV A,N
  1776. MOV NCNT,A
  1777. PBDMN1 : MOV R7,M
  1778. CLR A
  1779. CLR F0
  1780. PBDMN2 : XCH A,@R1
  1781. MOV B,#0AH
  1782. MUL AB
  1783. MOV C,F0
  1784. ADDC A,@R1
  1785. MOV F0,C
  1786. MOV @R1,A
  1787. INC R1
  1788. MOV A,B
  1789. DJNZ R7,PBDMN2
  1790. ADDC A,#00H
  1791. MOV @R0,A
  1792. INC R0
  1793. MOV A,R3
  1794. MOV R1,A
  1795. DJNZ NCNT,PBDMN1
  1796. MOV A,R2
  1797. MOV R0,A
  1798. RET
  1799. ;二進制整數(2位)轉換為十進制整數(分離BCD碼)
  1800. ;入口: R3,R4
  1801. ;占用資源: ACC,R2,NDIV31
  1802. ;堆棧需求: 5字節
  1803. ;出口: R0,NCNT
  1804. IBTD21 : MOV NCNT,#00H
  1805. MOV R2,#00H
  1806. IBD211 : MOV R7,#0AH
  1807. LCALL NDIV31
  1808. MOV A,R7
  1809. MOV @R0,A
  1810. INC R0
  1811. INC NCNT
  1812. MOV A,R3
  1813. ORL A,R4
  1814. JNZ IBD211
  1815. MOV A,R0
  1816. CLR C
  1817. SUBB A,NCNT
  1818. MOV R0,A
  1819. RET
  1820. ;二進制整數(2位)轉換為十進制整數(組合BCD碼)
  1821. ;入口: R3,R4
  1822. ;占用資源: ACC,B,R7
  1823. ;堆棧需求: 3字節
  1824. ;出口: R0
  1825. IBTD22 : MOV A,R0
  1826. PUSH ACC
  1827. MOV R7,#03H
  1828. CLR A
  1829. IBD221 : MOV @R0,A
  1830. INC R0
  1831. DJNZ R7,IBD221
  1832. POP ACC
  1833. MOV R0,A
  1834. MOV R7,#10H
  1835. IBD222 : PUSH ACC
  1836. CLR C
  1837. MOV A,R4
  1838. RLC A
  1839. MOV R4,A
  1840. MOV A,R3
  1841. RLC A
  1842. MOV R3,A
  1843. MOV B,#03H
  1844. IBD223 : MOV A,@R0
  1845. ADDC A,@R0
  1846. DA A
  1847. MOV @R0,A
  1848. INC R0
  1849. DJNZ B,IBD223
  1850. POP ACC
  1851. MOV R0,A
  1852. DJNZ R7,IBD222
  1853. RET
  1854. ;二進制整數(3位)轉換為十進制整數(分離BCD碼)
  1855. ;入口: R2,R3,R4
  1856. ;占用資源: ACC,R2,NDIV31
  1857. ;堆棧需求: 5字節
  1858. ;出口: R0,NCNT
  1859. IBTD31 : CLR A
  1860. MOV NCNT,A
  1861. IBD311 : MOV R7,#0AH
  1862. LCALL NDIV31
  1863. MOV A,R7
  1864. MOV @R0,A
  1865. INC R0
  1866. INC NCNT
  1867. MOV A,R2
  1868. ORL A,R3
  1869. ORL A,R4
  1870. JNZ IBD311
  1871. MOV A,R0
  1872. CLR C
  1873. SUBB A,NCNT
  1874. MOV R0,A
  1875. RET
  1876. ;二進制整數(3位)轉換為十進制整數(組合BCD碼)
  1877. ;入口: R2,R3,R4
  1878. ;占用資源: ACC,B,R7
  1879. ;堆棧需求: 3字節
  1880. ;出口: R0
  1881. IBTD32 : MOV A,R0
  1882. PUSH ACC
  1883. MOV R7,#04H
  1884. CLR A
  1885. IBD321 : MOV @R0,A
  1886. INC R0
  1887. DJNZ R7,IBD321
  1888. POP ACC
  1889. MOV R0,A
  1890. MOV R7,#18H
  1891. IBD322 : PUSH ACC
  1892. CLR C
  1893. MOV A,R4
  1894. RLC A
  1895. MOV R4,A
  1896. MOV A,R3
  1897. RLC A
  1898. MOV R3,A
  1899. MOV A,R2
  1900. RLC A
  1901. MOV R2,A
  1902. MOV B,#04H
  1903. IBD323 : MOV A,@R0
  1904. ADDC A,@R0
  1905. DA A
  1906. MOV @R0,A
  1907. INC R0
  1908. DJNZ B,IBD323
  1909. POP ACC
  1910. MOV R0,A
  1911. DJNZ R7,IBD322
  1912. RET
  1913. ;二進制整數(M位)轉換為十進制整數(組合BCD碼)
  1914. ;入口: R1,M,N
  1915. ;占用資源: ACC,B,R2,R3,R7
  1916. ;堆棧需求: 2字節
  1917. ;出口: R0
  1918. IBTDMN : MOV A,R0
  1919. MOV R2,A
  1920. MOV A,R1
  1921. MOV R3,A
  1922. MOV B,N
  1923. CLR A
  1924. IBDMN1 : MOV @R0,A
  1925. INC R0
  1926. DJNZ B,IBDMN1
  1927. MOV A,M
  1928. SWAP A
  1929. RR A
  1930. CLR C
  1931. MOV R7,A
  1932. IBDMN2 : MOV A,R2
  1933. MOV R0,A
  1934. MOV A,R3
  1935. MOV R1,A
  1936. MOV B,M
  1937. IBDMN3 : MOV A,@R1
  1938. RLC A
  1939. MOV @R1,A
  1940. INC R1
  1941. DJNZ B,IBDMN3
  1942. MOV B,N
  1943. IBDMN4 : MOV A,@R0
  1944. ADDC A,@R0
  1945. DA A
  1946. JNB ACC.4,IBDMN5
  1947. SETB C
  1948. CLR ACC.4
  1949. IBDMN5 : MOV @R0,A
  1950. INC R0
  1951. DJNZ B,IBDMN4
  1952. DJNZ R7,IBDMN2
  1953. MOV A,R2
  1954. MOV R0,A
  1955. RET
  1956. ;(一) MCS-51定點運算子程序庫及其使用說明
  1957. ;定點運算子程序庫文件名為DQ51.ASM,為便于使用,先將有關約定說明如下:
  1958. ;1.多字節定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續單元中的數
  1959. ;據。地址小的單元存放數據的高字節。例如:[R0]=123456H,若(R0)=30H,則(30H)=12H,
  1960. ;(31H)=34H,(32H)=56H。
  1961. ;2.運算精度:單次定點運算精度為結果最低位的當量值。
  1962. ;3.工作區:數據工作區固定在PSW、A、B、R2~R7,用戶只要不在工作區中存放無關的或非消耗性的信息,程序就具
  1963. ;有較好的透明性。
  1964. ;(1) 標號: BCDA 功能:多字節BCD碼加法
  1965. ;入口條件:字節數在R7中,被加數在[R0]中,加數在[R1]中。
  1966. ;出口信息:和在[R0]中,最高位進位在CY中。
  1967. ;影響資源:PSW、A、R2 堆棧需求: 2字節
  1968. BCDA: MOV A,R7 ;取字節數至R2中
  1969. MOV R2,A
  1970. ADD A,R0 ;初始化數據指針
  1971. MOV R0,A
  1972. MOV A,R2
  1973. ADD A,R1
  1974. MOV R1,A
  1975. CLR C
  1976. BCD1: DEC R0 ;調整數據指針
  1977. DEC R1
  1978. MOV A,@R0
  1979. ADDC A,@R1 ;按字節相加
  1980. DA A ;十進制調整
  1981. MOV @R0,A ;和存回[R0]中
  1982. DJNZ R2,BCD1 ;處理完所有字節
  1983. RET
  1984. ;(2) 標號: BCDB 功能:多字節BCD碼減法
  1985. ;入口條件:字節數在R7中,被減數在[R0]中,減數在[R1]中。
  1986. ;出口信息:差在[R0]中,最高位借位在CY中。
  1987. ;影響資源:PSW、A、R2、R3 堆棧需求: 6字節
  1988. BCDB: LCALL NEG1 ;減數[R1]十進制取補
  1989. LCALL BCDA ;按多字節BCD碼加法處理
  1990. CPL C ;將補碼加法的進位標志轉換成借位標志
  1991. MOV F0,C ;保護借位標志
  1992. LCALL NEG1 ;恢復減數[R1]的原始值
  1993. MOV C,F0 ;恢復借位標志
  1994. RET
  1995. NEG1: MOV A,R0 ;[R1]十進制取補子程序入口
  1996. XCH A,R1 ;交換指針
  1997. XCH A,R0
  1998. LCALL NEG ;通過[R0]實現[R1]取補
  1999. MOV A,R0
  2000. XCH A,R1 ;換回指針
  2001. XCH A,R0
  2002. RET
  2003. ;(3) 標號: NEG 功能:多字節BCD碼取補
  2004. ;入口條件:字節數在R7中,操作數在[R0]中。
  2005. ;出口信息:結果仍在[R0]中。
  2006. ;影響資源:PSW、A、R2、R3 堆棧需求: 2字節
  2007. NEG: MOV A,R7 ;取(字節數減一)至R2中
  2008. DEC A
  2009. MOV R2,A
  2010. MOV A,R0 ;保護指針
  2011. MOV R3,A
  2012. NEG0: CLR C
  2013. MOV A,#99H
  2014. SUBB A,@R0 ;按字節十進制取補
  2015. MOV @R0,A ;存回[R0]中
  2016. INC R0 ;調整數據指針
  2017. DJNZ R2,NEG0 ;處理完(R2)字節
  2018. MOV A,#9AH ;最低字節單獨取補
  2019. SUBB A,@R0
  2020. MOV @R0,A
  2021. MOV A,R3 ;恢復指針
  2022. MOV R0,A
  2023. RET
  2024. ;(4) 標號: BRLN 功能:多字節BCD碼左移十進制一位(乘十)
  2025. ;入口條件:字節數在R7中,操作數在[R0]中。
  2026. ;出口信息:結果仍在[R0]中,移出的十進制最高位在R3中。
  2027. ;影響資源:PSW、A、R2、R3 堆棧需求: 2字節
  2028. BRLN: MOV A,R7 ;取字節數至R2中
  2029. MOV R2,A
  2030. ADD A,R0 ;初始化數據指針
  2031. MOV R0,A
  2032. MOV R3,#0 ;工作單元初始化
  2033. BRL1: DEC R0 ;調整數據指針
  2034. MOV A,@R0 ;取一字節
  2035. SWAP A ;交換十進制高低位
  2036. MOV @R0,A ;存回
  2037. MOV A,R3 ;取低字節移出的十進制高位
  2038. XCHD A,@R0 ;換出本字節的十進制高位
  2039. MOV R3,A ;保存本字節的十進制高位
  2040. DJNZ R2,BRL1 ;處理完所有字節
  2041. RET
  2042. ;(5) 標號: MULD 功能:雙字節二進制無符號數乘法
  2043. ;入口條件:被乘數在R2、R3中,乘數在R6、R7中。
  2044. ;出口信息:乘積在R2、R3、R4、R5中。
  2045. ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
  2046. MULD: MOV A,R3 ;計算R3乘R7
  2047. MOV B,R7
  2048. MUL AB
  2049. MOV R4,B ;暫存部分積
  2050. MOV R5,A
  2051. MOV A,R3 ;計算R3乘R6
  2052. MOV B,R6
  2053. MUL AB
  2054. ADD A,R4 ;累加部分積
  2055. MOV R4,A
  2056. CLR A
  2057. ADDC A,B
  2058. MOV R3,A
  2059. MOV A,R2 ;計算R2乘R7
  2060. MOV B,R7
  2061. MUL AB
  2062. ADD A,R4 ;累加部分積
  2063. MOV R4,A
  2064. MOV A,R3
  2065. ADDC A,B
  2066. MOV R3,A
  2067. CLR A
  2068. RLC A
  2069. XCH A,R2 ;計算R2乘R6
  2070. MOV B,R6
  2071. MUL AB
  2072. ADD A,R3 ;累加部分積
  2073. MOV R3,A
  2074. MOV A,R2
  2075. ADDC A,B
  2076. MOV R2,A
  2077. RET
  2078. ;(6) 標號: MUL2 功能:雙字節二進制無符號數平方
  2079. ;入口條件:待平方數在R2、R3中。
  2080. ;出口信息:結果在R2、R3、R4、R5中。
  2081. ;影響資源:PSW、A、B、R2~R5 堆棧需求: 2字節
  2082. MUL2: MOV A,R3 ;計算R3平方
  2083. MOV B,A
  2084. MUL AB
  2085. MOV R4,B ;暫存部分積
  2086. MOV R5,A
  2087. MOV A,R2 ;計算R2平方
  2088. MOV B,A
  2089. MUL AB
  2090. XCH A,R3 ;暫存部分積,并換出R2和R3
  2091. XCH A,B
  2092. XCH A,R2
  2093. MUL AB ;計算2×R2×R3
  2094. CLR C
  2095. RLC A
  2096. XCH A,B
  2097. RLC A
  2098. JNC MU20
  2099. INC R2 ;累加溢出量
  2100. MU20: XCH A,B ;累加部分積
  2101. ADD A,R4
  2102. MOV R4,A
  2103. MOV A,R3
  2104. ADDC A,B
  2105. MOV R3,A
  2106. CLR A
  2107. ADDC A,R2
  2108. MOV R2,A
  2109. RET
  2110. ;(7) 標號: DIVD 功能:雙字節二進制無符號數除法
  2111. ;入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
  2112. ;出口信息:OV=0 時,雙字節商在R2、R3中,OV=1 時溢出。
  2113. ;影響資源:PSW、A、B、R1~R7 堆棧需求: 2字節
  2114. DIVD: CLR C ;比較被除數和除數
  2115. MOV A,R3
  2116. SUBB A,R7
  2117. MOV A,R2
  2118. SUBB A,R6
  2119. JC DVD1
  2120. SETB OV ;溢出
  2121. RET
  2122. DVD1: MOV B,#10H ;計算雙字節商
  2123. DVD2: CLR C ;部分商和余數同時左移一位
  2124. MOV A,R5
  2125. RLC A
  2126. MOV R5,A
  2127. MOV A,R4
  2128. RLC A
  2129. MOV R4,A
  2130. MOV A,R3
  2131. RLC A
  2132. MOV R3,A
  2133. XCH A,R2
  2134. RLC A
  2135. XCH A,R2
  2136. MOV F0,C ;保存溢出位
  2137. CLR C
  2138. SUBB A,R7 ;計算(R2R3-R6R7)
  2139. MOV R1,A
  2140. MOV A,R2
  2141. SUBB A,R6
  2142. ANL C,/F0 ;結果判斷
  2143. JC DVD3
  2144. MOV R2,A ;夠減,存放新的余數
  2145. MOV A,R1
  2146. MOV R3,A
  2147. INC R5 ;商的低位置一
  2148. DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
  2149. MOV A,R4 ;將商移到R2R3中
  2150. MOV R2,A
  2151. MOV A,R5
  2152. MOV R3,A
  2153. CLR OV ;設立成功標志
  2154. RET
  2155. ;(8) 標號: D457 功能:雙字節二進制無符號數除以單字節二進制數
  2156. ;入口條件:被除數在R4、R5中,除數在R7中。
  2157. ;出口信息:OV=0 時,單字節商在R3中,OV=1 時溢出。
  2158. ;影響資源:PSW、A、R3~R7 堆棧需求: 2字節
  2159. D457: CLR C
  2160. MOV A,R4
  2161. SUBB A,R7
  2162. JC DV50
  2163. SETB OV ;商溢出
  2164. RET
  2165. DV50: MOV R6,#8 ;求平均值(R4R5/R7-→R3)
  2166. DV51: MOV A,R5
  2167. RLC A
  2168. MOV R5,A
  2169. MOV A,R4
  2170. RLC A
  2171. MOV R4,A
  2172. MOV F0,C
  2173. CLR C
  2174. SUBB A,R7
  2175. ANL C,/F0
  2176. JC DV52
  2177. MOV R4,A
  2178. DV52: CPL C
  2179. MOV A,R3
  2180. RLC A
  2181. MOV R3,A
  2182. DJNZ R6,DV51
  2183. MOV A,R4 ;四舍五入
  2184. ADD A,R4
  2185. JC DV53
  2186. SUBB A,R7
  2187. JC DV54
  2188. DV53: INC R3
  2189. DV54: CLR OV
  2190. RET
  2191. ;(9) 標號: DV31 功能:三字節二進制無符號數除以單字節二進制數
  2192. ;入口條件:被除數在R3、R4、R5中,除數在R7中。
  2193. ;出口信息:OV=0 時,雙字節商在R4、R5中,OV=1 時溢出。
  2194. ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
  2195. DV31: CLR C
  2196. MOV A,R3
  2197. SUBB A,R7
  2198. JC DV30
  2199. SETB OV ;商溢出
  2200. RET
  2201. DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5
  2202. DM23: CLR C
  2203. MOV A,R5
  2204. RLC A
  2205. MOV R5,A
  2206. MOV A,R4
  2207. RLC A
  2208. MOV R4,A
  2209. MOV A,R3
  2210. RLC A
  2211. MOV R3,A
  2212. MOV F0,C
  2213. CLR C
  2214. SUBB A,R7
  2215. ANL C,/F0
  2216. JC DM24
  2217. MOV R3,A
  2218. INC R5
  2219. DM24: DJNZ R2,DM23
  2220. MOV A,R3 ;四舍五入
  2221. ADD A,R3
  2222. JC DM25
  2223. SUBB A,R7
  2224. JC DM26
  2225. DM25: INC R5
  2226. MOV A,R5
  2227. JNZ DM26
  2228. INC R4
  2229. DM26: CLR OV
  2230. RET ;商在R4R5中
  2231. ;(10) 標號: MULS 功能:雙字節二進制有符號數乘法(補碼)
  2232. ;入口條件:被乘數在R2、R3中,乘數在R6、R7中。
  2233. ;出口信息:乘積在R2、R3、R4、R5中。
  2234. ;影響資源:PSW、A、B、R2~R7 堆棧需求: 4字節
  2235. MULS: MOV R4,#0 ;清零R4R5
  2236. MOV R5,#0
  2237. LCALL MDS ;計算結果的符號和兩個操作數的絕對值
  2238. LCALL MULD ;計算兩個絕對值的乘積
  2239. SJMP MDSE ;用補碼表示結果
  2240. ;(11) 標號: DIVS 功能:雙字節二進制有符號數除法(補碼)
  2241. ;入口條件:被除數在R2、R3、R4、R5中,除數在R6、R7中。
  2242. ;出口信息:OV=0時商在R2、R3中,OV=1時溢出。
  2243. ;影響資源:PSW、A、B、R1~R7 堆棧需求: 5字節
  2244. DIVS: LCALL MDS ;計算結果的符號和兩個操作數的絕對值
  2245. PUSH PSW ;保存結果的符號
  2246. LCALL DIVD ;計算兩個絕對值的商
  2247. JNB OV,DVS1 ;溢出否?
  2248. POP ACC ;溢出,放去結果的符號,保留溢出標志
  2249. RET
  2250. DVS1: POP PSW ;未溢出,取出結果的符號
  2251. MOV R4,#0
  2252. MOV R5,#0
  2253. MDSE: JB F0,MDS2 ;用補碼表示結果
  2254. CLR OV ;結果為正,原碼即補碼,計算成功
  2255. RET
  2256. MDS: CLR F0 ;結果符號初始化
  2257. MOV A,R6 ;判斷第二操作數的符號
  2258. JNB ACC.7,MDS1;為正,不必處理
  2259. CPL F0 ;為負,結果符號取反
  2260. XCH A,R7 ;第二操作數取補,得到其絕對值
  2261. CPL A
  2262. ADD A,#1
  2263. XCH A,R7
  2264. CPL A
  2265. ADDC A,#0
  2266. MOV R6,A
  2267. MDS1: MOV A,R2 ;判斷第一操作數或運算結果的符號
  2268. JNB ACC.7,MDS3;為正,不必處理
  2269. CPL F0 ;為負,結果符號取反
  2270. MDS2: MOV A,R5 ;求第一操作數的絕對值或運算結果的補碼
  2271. CPL A
  2272. ADD A,#1
  2273. MOV R5,A
  2274. MOV A,R4
  2275. CPL A
  2276. ADDC A,#0
  2277. MOV R4,A
  2278. MOV A,R3
  2279. CPL A
  2280. ADDC A,#0
  2281. MOV R3,A
  2282. MOV A,R2
  2283. CPL A
  2284. ADDC A,#0
  2285. MOV R2,A
  2286. MDS3: CLR OV ;運算成功
  2287. RET
  2288. ;(12) 標號: SH2 功能:雙字節二進制無符號數開平方(快速)
  2289. ;入口條件:被開方數在R2、R3中。
  2290. ;出口信息:平方根仍在R2、R3中,整數部分的位數為原數的一半,其余為小數。
  2291. ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
  2292. SH2: MOV A,R2
  2293. ORL A,R3
  2294. JNZ SH20
  2295. RET ;被開方數為零,不必運算
  2296. SH20: MOV R7,#0 ;左規次數初始化
  2297. MOV A,R2
  2298. SH22: ANL A,#0C0H ;被開方數高字節小于40H否?
  2299. JNZ SQRH ;不小于40H,左規格化完成,轉開方過程
  2300. CLR C ;每左規一次,被開方數左移兩位
  2301. MOV A,R3
  2302. RLC A
  2303. MOV F0,C
  2304. CLR C
  2305. RLC A
  2306. MOV R3,A
  2307. MOV A,R2
  2308. MOV ACC.7,C
  2309. MOV C,F0
  2310. RLC A
  2311. RLC A
  2312. MOV R2,A
  2313. INC R7 ;左規次數加一
  2314. SJMP SH22 ;繼續左規
  2315. ;(13) 標號: SH4 功能:四字節二進制無符號數開平方(快速)
  2316. ;口條件:被開方數在R2、R3、R4、R5中。
  2317. ;出口信息:平方根在R2、R3中,整數部分的位數為原數的一半,其余為小數。
  2318. ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
  2319. SH4: MOV A,R2
  2320. ORL A,R3
  2321. ORL A,R4
  2322. ORL A,R5
  2323. JNZ SH40
  2324. RET ;被開方數為零,不必運算
  2325. SH40: MOV R7,#0 ;左規次數初始化
  2326. MOV A,R2
  2327. SH41: ANL A,#0C0H ;被開方數高字節小于40H否?
  2328. JNZ SQRH ;不小于40H,左規格化完成
  2329. MOV R6,#2 ;每左規一次,被開方數左移兩位
  2330. SH42: CLR C ;被開方數左移一位
  2331. MOV A,R5
  2332. RLC A
  2333. MOV R5,A
  2334. RLC A
  2335. MOV R4,A
  2336. MOV A,R3
  2337. RLC A
  2338. MOV R3,A
  2339. MOV A,R2
  2340. RLC A
  2341. MOV R2,A
  2342. DJNZ R6,SH42 ;被開方數左移完兩位
  2343. INC R7 ;左規次數加一
  2344. SJMP SH41 ;繼續左規
  2345. SQRH: MOV A,R2 ;規格化后高字節按折線法分為三個區間
  2346. ADD A,#57H
  2347. JC SQR2
  2348. ADD A,#45H
  2349. JC SQR1
  2350. ADD A,#24H
  2351. MOV B,#0E3H ;第一區間的斜率
  2352. MOV R4,#80H ;第一區間的平方根基數
  2353. SJMP SQR3
  2354. SQR1: MOV B,#0B2H ;第二區間的斜率
  2355. MOV R4,#0A0H;第二區間的平方根基數
  2356. SJMP SQR3
  2357. SQR2: MOV B,#8DH ;第三區間的斜率
  2358. MOV R4,#0D0H;第三區間的平方根基數
  2359. SQR3: MUL AB ;與區間基點的偏移量乘區間斜率
  2360. MOV A,B
  2361. ADD A,R4 ;累加到平方根的基數上
  2362. MOV R4,A
  2363. MOV B,A
  2364. MUL AB ;求當前平方根的冪
  2365. XCH A,R3 ;求偏移量(存放在R2R3中)
  2366. CLR C
  2367. SUBB A,R3
  2368. MOV R3,A
  2369. MOV A,R2
  2370. SUBB A,B
  2371. MOV R2,A
  2372. SQR4: SETB C ;用減奇數法校正一個字節的平方根
  2373. MOV A,R4 ;當前平方根的兩倍加一存入R5R6中
  2374. RLC A
  2375. MOV R6,A
  2376. CLR A
  2377. RLC A
  2378. MOV R5,A
  2379. MOV A,R3 ;偏移量小于該奇數否?
  2380. SUBB A,R6
  2381. MOV B,A
  2382. MOV A,R2
  2383. SUBB A,R5
  2384. JC SQR5 ;小于,校正結束,已達到一個字節的精度
  2385. INC R4 ;不小于,平方根加一
  2386. MOV R2,A ;保存新的偏移量
  2387. MOV R3,B
  2388. SJMP SQR4 ;繼續校正
  2389. SQR5: MOV A,R4 ;將一個字節精度的根存入R2
  2390. XCH A,R2
  2391. RRC A
  2392. MOV F0,C ;保存最終偏移量的最高位
  2393. MOV A,R3
  2394. MOV R5,A ;將最終偏移量的低八位存入R5中
  2395. MOV R4,#8 ;通過(R5R6/R2)求根的低字節
  2396. SQR6: CLR C
  2397. MOV A,R3
  2398. RLC A
  2399. MOV R3,A
  2400. CLR C
  2401. MOV A,R5
  2402. SUBB A,R2
  2403. JB F0,SQR7
  2404. JC SQR8
  2405. SQR7: MOV R5,A
  2406. INC R3
  2407. SQR8: CLR C
  2408. MOV A,R5
  2409. RLC A
  2410. MOV R5,A
  2411. MOV F0,C
  2412. DJNZ R4,SQR6 ;根的第二字節計算完,在R3中
  2413. MOV A,R7 ;取原被開方數的左規次數
  2414. JZ SQRE ;未左規,開方結束
  2415. SQR9: CLR C ;按左規次數右移平方根,得到實際根
  2416. MOV A,R2
  2417. RRC A
  2418. MOV R2,A
  2419. MOV A,R3
  2420. RRC A
  2421. MOV R3,A
  2422. DJNZ R7,SQR9
  2423. SQRE: RET
  2424. ;(14) 標號: HASC 功能:單字節十六進制數轉換成雙字節ASCII碼
  2425. ;入口條件:待轉換的單字節十六進制數在累加器A中。
  2426. ;出口信息:高四位的ASCII碼在A中,低四位的ASCII碼在B中。
  2427. ;影響資源:PSW、A、B 堆棧需求: 4字節
  2428. HASC: MOV B,A ;暫存待轉換的單字節十六進制數
  2429. LCALL HAS1 ;轉換低四位
  2430. XCH A,B ;存放低四位的ASCII碼
  2431. SWAP A ;準備轉換高四位
  2432. HAS1: ANL A,#0FH ;將累加器的低四位轉換成ASCII碼
  2433. ADD A,#90H
  2434. DA A
  2435. ADDC A,#40H
  2436. DA A
  2437. RET
  2438. ;(15) 標號: ASCH 功能:ASCII碼轉換成十六進制數
  2439. ;入口條件:待轉換的ASCII碼(30H~39H或41H~46H)在A中。
  2440. ;出口信息:轉換后的十六進制數(00H~0FH)仍在累加器A中。
  2441. ;影響資源:PSW、A 堆棧需求: 2字節
  2442. ASCH: CLR C
  2443. SUBB A,#30H
  2444. JNB ACC.4,ASH1
  2445. SUBB A,#7
  2446. ASH1: RET
  2447. ;(16) 標號:HBCD 功能:單字節十六進制整數轉換成單字節BCD碼整數
  2448. ;入口條件:待轉換的單字節十六進制整數在累加器A中。
  2449. ;出口信息:轉換后的BCD碼整數(十位和個位)仍在累加器A中,百位在R3中。
  2450. ;影響資源:PSW、A、B、R3 堆棧需求: 2字節
  2451. HBCD: MOV B,#100 ;分離出百位,存放在R3中
  2452. DIV AB
  2453. MOV R3,A
  2454. MOV A,#10 ;余數繼續分離十位和個位
  2455. XCH A,B
  2456. DIV AB
  2457. SWAP A
  2458. ORL A,B ;將十位和個位拼裝成BCD碼
  2459. RET
  2460. ;(17) 標號: HB2 功能:雙字節十六進制整數轉換成雙字節BCD碼整數
  2461. ;入口條件:待轉換的雙字節十六進制整數在R6、R7中。
  2462. ;出口信息:轉換后的三字節BCD碼整數在R3、R4、R5中。
  2463. ;影響資源:PSW、A、R2~R7 堆棧需求: 2字節
  2464. HB2: CLR A ;BCD碼初始化
  2465. MOV R3,A
  2466. MOV R4,A
  2467. MOV R5,A
  2468. MOV R2,#10H ;轉換雙字節十六進制整數
  2469. HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中
  2470. RLC A
  2471. MOV R7,A
  2472. MOV A,R6
  2473. RLC A
  2474. MOV R6,A
  2475. MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
  2476. ADDC A,R5
  2477. DA A ;十進制調整
  2478. MOV R5,A
  2479. MOV A,R4
  2480. ADDC A,R4
  2481. DA A
  2482. MOV R4,A
  2483. MOV A,R3
  2484. ADDC A,R3
  2485. MOV R3,A ;雙字節十六進制數的萬位數不超過6,不用調整
  2486. DJNZ R2,HB3 ;處理完16bit
  2487. RET
  2488. ;(18) 標號: HBD 功能:單字節十六進制小數轉換成單字節BCD碼小數
  2489. ;入口條件:待轉換的單字節十六進制小數在累加器A中。
  2490. ;出口信息:CY=0時轉換后的BCD碼小數仍在A中。CY=1時原小數接近整數1。
  2491. ;影響資源:PSW、A、B 堆棧需求: 2字節
  2492. HBD: MOV B,#100 ;原小數擴大一百倍
  2493. MUL AB
  2494. RLC A ;余數部分四舍五入
  2495. CLR A
  2496. ADDC A,B
  2497. MOV B,#10 ;分離出十分位和百分位
  2498. DIV AB
  2499. SWAP A
  2500. ADD A,B ;拼裝成單字節BCD碼小數
  2501. DA A ;調整后若有進位,原小數接近整數1
  2502. RET
  2503. ;(19) 標號: HBD2 功能:雙字節十六進制小數轉換成雙字節BCD碼小數
  2504. ;入口條件:待轉換的雙字節十六進制小數在R2、R3中。
  2505. ;出口信息:轉換后的雙字節BCD碼小數仍在R2、R3中。
  2506. ;影響資源:PSW、A、B、R2、R3、R4、R5 堆棧需求: 6字節
  2507. HBD2: MOV R4,#4 ;四位十進制碼
  2508. HBD3: MOV A,R3 ;原小數擴大十倍
  2509. MOV B,#10
  2510. MUL AB
  2511. MOV R3,A
  2512. MOV R5,B
  2513. MOV A,R2
  2514. MOV B,#10
  2515. MUL AB
  2516. ADD A,R5
  2517. MOV R2,A
  2518. CLR A
  2519. ADDC A,B
  2520. PUSH ACC ;保存溢出的一位十進制碼
  2521. DJNZ R4,HBD3 ;計算完四位十進制碼
  2522. POP ACC ;取出萬分位
  2523. MOV R3,A
  2524. POP ACC ;取出千分位
  2525. SWAP A
  2526. ORL A,R3 ;拼裝成低字節BCD碼小數
  2527. MOV R3,A
  2528. POP ACC ;取出百分位
  2529. MOV R2,A
  2530. POP ACC ;取出十分位
  2531. SWAP A
  2532. ORL A,R2 ;拼裝成高字節BCD碼小數
  2533. MOV R2,A
  2534. RET
  2535. ;(20)標號:BCDH 功能:單字節BCD碼整數轉換成單字節十六進制整數
  2536. ;入口條件:待轉換的單字節BCD碼整數在累加器A中。
  2537. ;出口信息:轉換后的單字節十六進制整數仍在累加器A中。
  2538. ;影響資源:PSW、A、B、R4 堆棧需求: 2字節
  2539. BCDH: MOV B,#10H ;分離十位和個位
  2540. DIV AB
  2541. MOV R4,B ;暫存個位
  2542. MOV B,#10 ;將十位轉換成十六進制
  2543. MUL AB
  2544. ADD A,R4 ;按十六進制加上個位
  2545. RET
  2546. ;(21)標號: BH2 功能:雙字節BCD碼整數轉換成雙字節十六進制整數
  2547. ;入口條件:待轉換的雙字節BCD碼整數在R2、R3中。
  2548. ;出口信息:轉換后的雙字節十六進制整數仍在R2、R3中。
  2549. ;影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節
  2550. BH2: MOV A,R3 ;將低字節轉換成十六進制
  2551. LCALL BCDH
  2552. MOV R3,A
  2553. MOV A,R2 ;將高字節轉換成十六進制
  2554. LCALL BCDH
  2555. MOV B,#100 ;擴大一百倍
  2556. MUL AB
  2557. ADD A,R3 ;和低字節按十六進制相加
  2558. MOV R3,A
  2559. CLR A
  2560. ADDC A,B
  2561. MOV R2,A
  2562. RET
  2563. ;(22)標號: BHD 功能:單字節BCD碼小數轉換成單字節十六進制小數
  2564. ;入口條件:待轉換的單字節BCD碼數在累加器A中。
  2565. ;出口信息:轉換后的單字節十六進制小數仍在累加器A中。
  2566. ;影響資源:PSW、A、R2、R3 堆棧需求: 2字節
  2567. BHD: MOV R2,#8 ;準備計算一個字節小數
  2568. BHD0: ADD A,ACC ;按十進制倍增
  2569. DA A
  2570. XCH A,R3
  2571. RLC A ;將進位標志移入結果中
  2572. XCH A,R3
  2573. DJNZ R2,BHD0 ;共計算8bit小數
  2574. ADD A,#0B0H ;剩余部分達到0.50否?
  2575. JNC BHD1 ;四舍
  2576. INC R3 ;五入
  2577. BHD1: MOV A,R3 ;取結果
  2578. RET
  2579. ;(23)標號: BHD2 功能:雙字節BCD碼小數轉換成雙字節十六進制小數
  2580. ;入口條件:待轉換的雙字節BCD碼小數在R4、R5中。
  2581. ;出口信息:轉換后的雙字節十六進制小數在R2、R3中。
  2582. ;影響資源:PSW、A、R2~R6 堆棧需求: 2字節
  2583. BHD2: MOV R6,#10H ;準備計算兩個字節小數
  2584. BHD3: MOV A,R5 ;按十進制倍增
  2585. ADD A,R5
  2586. DA A
  2587. MOV R5,A
  2588. MOV A,R4
  2589. ADDC A,R4
  2590. DA A
  2591. MOV R4,A
  2592. MOV A,R3 ;將進位標志移入結果中
  2593. RLC A
  2594. MOV R3,A
  2595. MOV A,R2
  2596. RLC A
  2597. MOV R2,A
  2598. DJNZ R6,BHD3 ;共計算16bit小數
  2599. MOV A,R4
  2600. ADD A,#0B0H ;剩余部分達到0.50否?
  2601. JNC BHD4 ;四舍
  2602. INC R3 ;五入
  2603. MOV A,R3
  2604. JNZ BHD4
  2605. INC R2
  2606. BHD4: RET
  2607. ;(24) 標號: MM 功能:求單字節十六進制無符號數據塊的極值
  2608. ;入口條件:數據塊的首址在DPTR中,數據個數在R7中。
  2609. ;出口信息:最大值在R6中,地址在R2R3中;最小值在R7中,地址在R4R5中。
  2610. ;影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節
  2611. MM: MOV B,R7 ;保存數據個數
  2612. MOVX A,@DPTR ;讀取第一個數據
  2613. MOV R6,A ;作為最大值的初始值
  2614. MOV R7,A ;也作為最小值的初始值
  2615. MOV A,DPL ;取第一個數據的地址
  2616. MOV R3,A ;作為最大值存放地址的初始值
  2617. MOV R5,A ;也作為最小值存放地址的初始值
  2618. MOV A,DPH
  2619. MOV R2,A
  2620. MOV R4,A
  2621. MOV A,B ;取數據個數
  2622. DEC A ;減一,得到需要比較的次數
  2623. JZ MME ;只有一個數據,不需要比較
  2624. MOV R1,A ;保存比較次數
  2625. PUSH DPL ;保護數據塊的首址
  2626. PUSH DPH
  2627. MM1: INC DPTR ;指向一個新的數據
  2628. MOVX A,@DPTR ;讀取這個數據
  2629. MOV B,A ;保存
  2630. SETB C ;與最大值比較
  2631. SUBB A,R6
  2632. JC MM2 ;不超過當前最大值,保持當前最大值
  2633. MOV R6,B ;超過當前最大值,更新最大值存放地址
  2634. MOV R2,DPH ;同時更新最大值存放地址
  2635. MOV R3,DPL
  2636. SJMP MM3
  2637. MM2: MOV A,B ;與最小值比較
  2638. CLR C
  2639. SUBB A,R7
  2640. JNC MM3 ;大于或等于當前最小值,保持當前最小值
  2641. MOV R7,B ;更新最小值
  2642. MOV R4,DPH ;更新最小值存放地址
  2643. MOV R5,DPL
  2644. MM3: DJNZ R1,MM1 ;處理完全部數據
  2645. POP DPH ;恢復數據首址
  2646. POP DPL
  2647. MME: RET
  2648. ;(25) 標號: MMS 功能:求單字節十六進制有符號數據塊的極值
  2649. ;入口條件:數據塊的首址在DPTR中,數據個數在R7中。
  2650. ;出口信息:最大值在R6中, 地址在R2R3中;最小值在R7中,地址在R4R5中。
  2651. ;影響資源:PSW、A、B、R1~R7 堆棧需求: 4字節
  2652. MMS: MOV B,R7 ;保存數據個數
  2653. MOVX A,@DPTR ;讀取第一個數據
  2654. MOV R6,A ;作為最大值的初始值
  2655. MOV R7,A ;也作為最小值的初始值
  2656. MOV A,DPL ;取第一個數據的地址
  2657. MOV R3,A ;作為最大值存放地址的初始值
  2658. MOV R5,A ;也作為最小值存放地址的初始值
  2659. MOV A,DPH
  2660. MOV R2,A
  2661. MOV R4,A
  2662. MOV A,B ;取數據個數
  2663. DEC A ;減一,得到需要比較的次數
  2664. JZ MMSE ;只有一個數據,不需要比較
  2665. MOV R1,A ;保存比較次數
  2666. PUSH DPL ;保護數據塊的首址
  2667. PUSH DPH
  2668. MMS1: INC DPTR ;調整數據指針
  2669. MOVX A,@DPTR ;讀取一個數據
  2670. MOV B,A ;保存
  2671. SETB C ;與最大值比較
  2672. SUBB A,R6
  2673. JZ MMS4 ;相同,不更新最大值
  2674. JNB OV,MMS2 ;差未溢出,符號位有效
  2675. CPL ACC.7 ;差溢出,符號位取反
  2676. MMS2: JB ACC.7,MMS4;差為負,不更新最大值
  2677. MOV R6,B ;更新最大值
  2678. MOV R2,DPH ;更新最大值存放地址
  2679. MOV R3,DPL
  2680. SJMP MMS7
  2681. MMS4: MOV A,B ;與最小值比較
  2682. CLR C
  2683. SUBB A,R7
  2684. JNB OV,MMS6 ;差未溢出,符號位有效
  2685. CPL ACC.7 ;差溢出,符號位取反
  2686. MMS6: JNB ACC.7,MMS7;差為正,不更新最小值
  2687. MOV R7,B ;更新最小值
  2688. MOV R4,DPH ;更新最小值存放地址
  2689. MOV R5,DPL
  2690. MMS7: DJNZ R1,MMS1 ;處理完全部數據
  2691. POP DPH ;恢復數據首址
  2692. POP DPL
  2693. MMSE: RET
  2694. ;(26) 標號: FDS1 功能:順序查找(ROM)單字節表格
  2695. ;入口條件:待查找的內容在A中,表格首址在DPTR中,表格的字節數在R7中。
  2696. ;出口信息:OV=0時,順序號在累加器A中;OV=1時,未找到。
  2697. ;影響資源:PSW、A、B、R2、R6 堆棧需求: 2字節
  2698. FDS1: MOV B,A ;保存待查找的內容
  2699. MOV R2,#0 ;順序號初始化(指向表首)
  2700. MOV A,R7 ;保存表格的長度
  2701. MOV R6,A
  2702. FD11: MOV A,R2 ;按順序號讀取表格內容
  2703. MOVC A,@A+DPTR
  2704. CJNE A,B,FD12;與待查找的內容比較
  2705. CLR OV ;相同,查找成功
  2706. MOV A,R2 ;取對應的順序號
  2707. RET
  2708. FD12: INC R2 ;指向表格中的下一個內容
  2709. DJNZ R6,FD11 ;查完全部表格內容
  2710. SETB OV ;未查找到,失敗
  2711. RET
  2712. ;(27) 標號: FDS2 功能:順序查找(ROM)雙字節表格
  2713. ;入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據總個數在R7中。
  2714. ;出口信息:OV=0時順序號在累加器A中,地址在DPTR中;OV=1時未找到。
  2715. ;影響資源:PSW、A、R2、R6、DPTR 堆棧需求: 2字節
  2716. FDS2: MOV A,R7 ;保存表格中數據的個數
  2717. MOV R6,A
  2718. MOV R2,#0 ;順序號初始化(指向表首)
  2719. FD21: CLR A ;讀取表格內容的高字節
  2720. MOVC A,@A+DPTR
  2721. XRL A,R4 ;與待查找內容的高字節比較
  2722. JNZ FD22
  2723. MOV A,#1 ;讀取表格內容的低字節
  2724. MOVC A,@A+DPTR
  2725. XRL A,R5 ;與待查找內容的低字節比較
  2726. JNZ FD22
  2727. CLR OV ;相同,查找成功
  2728. MOV A,R2 ;取對應的順序號
  2729. RET
  2730. FD22: INC DPTR ;指向下一個數據
  2731. INC DPTR
  2732. INC R2 ;順序號加一
  2733. DJNZ R6,FD21 ;查完全部數據
  2734. SETB OV ;未查找到,失敗
  2735. RET
  2736. ;(28) 標號:FDD1 功能:對分查找(ROM)單字節無符號增序數據表格
  2737. ;入口條件:待查找的內容在累加器A中,表格首址在DPTR中,字節數在R7中。
  2738. ;出口信息:OV=0 時,順序號在累加器A中;OV=1 時,未找到。
  2739. ;影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 2字節
  2740. FDD1: MOV B,A ;保存待查找的內容
  2741. MOV R2,#0 ;區間低端指針初始化(指向第一個數據)
  2742. MOV A,R7
  2743. DEC A
  2744. MOV R3,A ;區間高端指針初始化(指向最后一個數據)
  2745. FD61: CLR C ;判斷區間大小
  2746. MOV A,R3
  2747. SUBB A,R2
  2748. JC FD69 ;區間消失,查找失敗
  2749. RRC A ;取區間大小的一半
  2750. ADD A,R2 ;加上區間的低端
  2751. MOV R4,A ;得到區間的中心
  2752. MOVC A,@A+DPTR;讀取該點的內容
  2753. CJNE A,B,FD65;與待查找的內容比較
  2754. CLR OV ;相同,查找成功
  2755. MOV A,R4 ;取順序號
  2756. RET
  2757. FD65: JC FD68 ;該點的內容比待查找的內容大否?
  2758. MOV A,R4 ;偏大,取該點位置
  2759. DEC A ;減一
  2760. MOV R3,A ;作為新的區間高端
  2761. SJMP FD61 ;繼續查找
  2762. FD68: MOV A,R4 ;偏小,取該點位置
  2763. INC A ;加一
  2764. MOV R2,A ;作為新的區間低端
  2765. SJMP FD61 ;繼續查找
  2766. FD69: SETB OV ;查找失敗
  2767. RET
  2768. ;(29) 標號:FDD2 功能:對分查找(ROM)雙字節無符號增序數據表格
  2769. ;入口條件:查找內容在R4、R5中,表格首址在DPTR中,數據個數在R7中。
  2770. ;出口信息:OV=0 時順序號在累加器A中,址在DPTR中;OV=1 時未找到。
  2771. ;影響資源:PSW、A、B、R1~R7、DPTR 堆棧需求: 2字節
  2772. FDD2: MOV R2,#0 ;區間低端指針初始化(指向第一個數據)
  2773. MOV A,R7
  2774. DEC A
  2775. MOV R3,A ;區間高端指針初始化,指向最后一個數據
  2776. MOV R6,DPH ;保存表格首址
  2777. MOV R7,DPL
  2778. FD81: CLR C ;判斷區間大小
  2779. MOV A,R3
  2780. SUBB A,R2
  2781. JC FD89 ;區間消失,查找失敗
  2782. RRC A ;取區間大小的一半
  2783. ADD A,R2 ;加上區間的低端
  2784. MOV R1,A ;得到區間的中心
  2785. MOV DPH,R6
  2786. CLR C ;計算區間中心的地址
  2787. RLC A
  2788. JNC FD82
  2789. INC DPH
  2790. FD82: ADD A,R7
  2791. MOV DPL,A
  2792. JNC FD83
  2793. INC DPH
  2794. FD83: CLR A ;讀取該點的內容的高字節
  2795. MOVC A,@A+DPTR
  2796. MOV B,R4 ;與待查找內容的高字節比較
  2797. CJNE A,B,FD84;不相同
  2798. MOV A,#1 ;讀取該點的內容的低字節
  2799. MOVC A,@A+DPTR
  2800. MOV B,R5
  2801. CJNE A,B,FD84;與待查找內容的低字節比較
  2802. MOV A,R1 ;取順序號
  2803. CLR OV ;查找成功
  2804. RET
  2805. FD84: JC FD86 ;該點的內容比待查找的內容大否?
  2806. MOV A,R1 ;偏大,取該點位置
  2807. DEC A ;減一
  2808. MOV R3,A ;作為新的區間高端
  2809. SJMP FD81 ;繼續查找
  2810. FD86: MOV A,R1 ;偏小,取該點位置
  2811. INC A ;加一
  2812. MOV R2,A ;作為新的區間低端
  2813. SJMP FD81 ;繼續查找
  2814. FD89: MOV DPH,R6 ;相同,恢復首址
  2815. MOV DPL,R7
  2816. SETB OV ;查找失敗
  2817. RET
  2818. ;(30) 標號: DDM1 功能:求單字節十六進制無符號數據塊的平均值
  2819. ;入口條件:數據塊的首址在DPTR中,數據個數在R7中。
  2820. ;出口信息:平均值在累加器A中。
  2821. ;影響資源:PSW、A、R2~R6 堆棧需求: 4字節
  2822. DDM1: MOV A,R7 ;保存數據個數
  2823. MOV R2,A
  2824. PUSH DPH
  2825. PUSH DPL
  2826. CLR A ;初始化累加和
  2827. MOV R4,A
  2828. MOV R5,A
  2829. DM11: MOVX A,@DPTR ;讀取一個數據
  2830. ADD A,R5 ;累加到累加和中
  2831. MOV R5,A
  2832. JNC DM12
  2833. INC R4
  2834. DM12: INC DPTR ;調整指針
  2835. DJNZ R2,DM11 ;累加完全部數據
  2836. LCALL D457 ;求平均值(R4R5/R7-→R3)
  2837. MOV A,R3 ;取平均值
  2838. POP DPL
  2839. POP DPH
  2840. RET
  2841. ;(31) 標號: DDM2 功能:求雙字節十六進制無符號數據塊的平均值
  2842. ;入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R7中。
  2843. ;出口信息:平均值在R4、R5中。
  2844. ;影響資源:PSW、A、R2~R6 堆棧需求: 4字節
  2845. DDM2: MOV A,R7 ;保存數據個數
  2846. MOV R2,A ;初始化數據指針
  2847. PUSH DPL ;保持首址
  2848. PUSH DPH
  2849. CLR A ;初始化累加和
  2850. MOV R3,A
  2851. MOV R4,A
  2852. MOV R5,A
  2853. DM20: MOVX A,@DPTR ;讀取一個數據的高字節
  2854. MOV B,A
  2855. INC DPTR
  2856. MOVX A,@DPTR ;讀取一個數據的低字節
  2857. INC DPTR
  2858. ADD A,R5 ;累加到累加和中
  2859. MOV R5,A
  2860. MOV A,B
  2861. ADDC A,R4
  2862. MOV R4,A
  2863. JNC DM21
  2864. INC R3
  2865. DM21: DJNZ R2,DM20 ;累加完全部數據
  2866. POP DPH ;恢復首址
  2867. POP DPL
  2868. LJMP DV31 ;求R3R4R5/R7-→R4R5,得到平均值
  2869. ;(32) 標號: XR1 功能:求單字節數據塊的(異或)校驗和
  2870. ;入口條件:數據塊的首址在DPTR中,數據的個數在R6、R7中。
  2871. ;出口信息:校驗和在累加器A中。
  2872. ;影響資源:PSW、A、B、R4~R7 堆棧需求: 2字節
  2873. XR1: MOV R4,DPH ;保存數據塊的首址
  2874. MOV R5,DPL
  2875. MOV A,R7 ;雙字節計數器調整
  2876. JZ XR10
  2877. INC R6
  2878. XR10: MOV B,#0 ;校驗和初始化
  2879. XR11: MOVX A,@DPTR ;讀取一個數據
  2880. XRL B,A ;異或運算
  2881. INC DPTR ;指向下一個數據
  2882. DJNZ R7,XR11 ;雙字節計數器減一
  2883. DJNZ R6,XR11
  2884. MOV DPH,R4 ;恢復數據首址
  2885. MOV DPL,R5
  2886. MOV A,B ;取校驗和
  2887. RET
  2888. ;(33) 標號: XR2 功能:求雙字節數據塊的(異或)校驗和
  2889. ;入口條件:數據塊的首址在DPTR中,雙字節數據總個數在R6、R7中。
  2890. ;出口信息:校驗和在R2、R3中。
  2891. ;影響資源:PSW、A、R2~R7 堆棧需求: 2字節
  2892. XR2: MOV R4,DPH ;保存數據塊的首址
  2893. MOV R5,DPL
  2894. MOV A,R7 ;雙字節計數器調整
  2895. JZ XR20
  2896. INC R6
  2897. XR20: CLR A ;校驗和初始化
  2898. MOV R2,A
  2899. MOV R3,A
  2900. XR21: MOVX A,@DPTR ;讀取一個數據的高字節
  2901. XRL A,R2 ;異或運算
  2902. MOV R2,A
  2903. INC DPTR
  2904. MOVX A,@DPTR ;讀取一個數據的低字節
  2905. XRL A,R3 ;異或運算
  2906. MOV R3,A
  2907. INC DPTR ;指向下一個數據
  2908. DJNZ R7,XR21 ;雙字節計數器減一
  2909. DJNZ R6,XR21
  2910. MOV DPH,R4 ;恢復數據首址
  2911. MOV DPL,R5
  2912. RET
  2913. ;(34) 標號: SORT 功能:單字節無符號數據塊排序(增序)
  2914. ;入口條件:數據塊的首址在R0中,字節數在R7中。
  2915. ;出口信息:完成排序(增序)
  2916. ;影響資源:PSW、A、R2~R6 堆棧需求: 2字節
  2917. SORT: MOV A,R7
  2918. MOV R5,A ;比較次數初始化
  2919. SRT1: CLR F0 ;交換標志初始化
  2920. MOV A,R5 ;取上遍比較次數
  2921. DEC A ;本遍比上遍減少一次
  2922. MOV R5,A ;保存本遍次數
  2923. MOV R2,A ;復制到計數器中
  2924. JZ SRT5 ;若為零,排序結束
  2925. MOV A,R0 ;保存數據指針
  2926. MOV R6,A
  2927. SRT2: MOV A,@R0 ;讀取一個數據
  2928. MOV R3,A
  2929. INC R0 ;指向下一個數據
  2930. MOV A,@R0 ;再讀取一個數據
  2931. MOV R4,A
  2932. CLR C
  2933. SUBB A,R3 ;比較兩個數據的大小
  2934. JNC SRT4 ;順序正確(增序或相同),不必交換
  2935. SETB F0 ;設立交換標志
  2936. MOV A,R3 ;將兩個數據交換位置
  2937. MOV @R0,A
  2938. DEC R0
  2939. MOV A,R4
  2940. MOV @R0,A
  2941. INC R0 ;指向下一個數據
  2942. SRT4: DJNZ R2,SRT2 ;完成本遍的比較次數
  2943. MOV A,R6 ;恢復數據首址
  2944. MOV R0,A
  2945. JB F0,SRT1 ;本遍若進行過交換,則需繼續排序
  2946. SRT5: RET ;排序結束
  2947. END
  2948. ;(二) MCS-51 浮點運算子程序庫及其使用說明
  2949. ;本浮點子程序庫有三個不同層次的版本,以便適應不同的應用場合:
  2950. ;1.小型庫(FQ51A.ASM):只包含浮點加、減、乘、除子程序。
  2951. ;2.中型庫(FQ51B.ASM):在小型庫的基礎上再增加絕對值、倒數、比較、平方、開平方、
  2952. ;數制轉換等子程序。
  2953. ;3.大型庫(FQ51.ASM):包含本說明書中的全部子程序。
  2954. ;為便于讀者使用本程序庫,先將有關約定說明如下:
  2955. ;1.雙字節定點操作數:用[R0]或[R1]來表示存放在由R0或R1指示的連續單元中的數
  2956. ;據,地址小的單元存放高字節。如果[R0]=1234H,若(R0)=30H,則(30H)=12H,(31H)=34H。
  2957. ;2.二進制浮點操作數:用三個字節表示,第一個字節的最高位為數符,其余七位為
  2958. ;階碼(補碼形式),第二字節為尾數的高字節,第三字節為尾數的低字節,尾數用雙字節
  2959. ;純小數(原碼)來表示。當尾數的最高位為1時,便稱為規格化浮點數,簡稱操作數。在
  2960. ;程序說明中,也用[R0]或[R1]來表示R0或R1指示的浮點操作數,例如:當[R0]=-6.000時,
  2961. ;則二進制浮點數表示為83C000H。若(R0)=30H,則(30H)=83H,(31H)=0C0H,(32H)=00H。
  2962. ;3.十進制浮點操作數:用三個字節表示,第一個字節的最高位為數符,其余七位為
  2963. ;階碼(二進制補碼形式),第二字節為尾數的高字節,第三字節為尾數的低字節,尾數用
  2964. ;雙字節BCD碼純小數(原碼)來表示。當十進制數的絕對值大于1時,階碼就等于整數
  2965. ;部分的位數,如 876.5 的階碼是03H,-876.5 的階碼是 83H;當十進制數的絕對值小于1
  2966. ;時,階碼就等于 80H 減去小數點后面零的個數,例如 0.00382 的階碼是 7EH,-0.00382
  2967. ;的階碼是 0FEH。在程序說明中,用[R0]或[R1]來表示R0或R1指示的十進制浮點操作數。例
  2968. ;如有一個十進制浮點操作數存放在30H、31H、32H中,數值是 -0.07315,即-0.7315乘以10
  2969. ;的-1次方,則(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]來指向它,則應使(R0)=30H。
  2970. ;4.運算精度:單次定點運算精度為結果最低位的當量值;單次二進制浮點算術運算
  2971. ;的精度優于十萬分之三;單次二進制浮點超越函數運算的精度優于萬分之一;BCD碼浮
  2972. ;點數本身的精度比較低(萬分之一到千分之一),不宜作為運算的操作數,僅用于輸入或
  2973. ;輸出時的數制轉換。不管那種數據格式,隨著連續運算的次數增加,精度都會下降。
  2974. ;5.工作區:數據工作區固定在A、B、R2~R7,數符或標志工作區固定在PSW和23H單
  2975. ;元(位1CH~1FH)。在浮點系統中,R2、R3、R4和位1FH為第一工作區,R5、R6、R7和位1EH
  2976. ;為第二工作區。用戶只要不在工作區中存放無關的或非消耗性的信息,程序就具有較好的
  2977. ;透明性。
  2978. ;6.子程序調用范例:由于本程序庫特別注意了各子程序接口的相容性,很容易采用
  2979. ;積木方式(或流水線方式)完成一個公式的計算。以浮點運算為例:
  2980. ;計算 y = Ln √ | Sin (ab/c+d) |
  2981. ;已知:a=-123.4;b=0.7577;c=56.34;d=1.276; 它們分別存放在30H、33H、36H、
  2982. ;39H開始的連續三個單元中。用BCD碼浮點數表示時,分別為a=831234H;b=007577H;
  2983. ;c=025634H;d=011276H。
  2984. ;求解過程:通過調用BTOF子程序,將各變量轉換成二進制浮點操作數,再進行各
  2985. ;種運算,最后調用FTOB子程序,還原成十進制形式,供輸出使用。程序如下:
  2986. TEST: MOV R0,#39H ;指向BCD碼浮點操作數d
  2987. LCALL BTOF ;將其轉換成二進制浮點操作數
  2988. MOV R0,#36H ;指向BCD碼浮點操作數c
  2989. LCALL BTOF ;將其轉換成二進制浮點操作數
  2990. MOV R0,#33H ;指向BCD碼浮點操作數b
  2991. LCALL BTOF ;將其轉換成二進制浮點操作數
  2992. MOV R0,#30H ;指向BCD碼浮點操作數a
  2993. LCALL BTOF ;將其轉換成二進制浮點操作數
  2994. MOV R1,#33H ;指向二進制浮點操作數b
  2995. LCALL FMUL ;進行浮點乘法運算
  2996. MOV R1,#36H ;指向二進制浮點操作數c
  2997. LCALL FDIV ;進行浮點除法運算
  2998. MOV R1,#39H ;指向二進制浮點操作數d
  2999. LCALL FADD ;進行浮點加法運算
  3000. LCALL FSIN ;進行浮點正弦運算
  3001. LCALL FABS ;進行浮點絕對值運算
  3002. LCALL FSQR ;進行浮點開平方運算
  3003. LCALL FLN ;進行浮點對數運算
  3004. LCALL FTOB ;將結果轉換成BCD碼浮點數
  3005. STOP: LJMP STOP
  3006. END
  3007. ;運行結果,[R0]=804915H,即y=-0.4915,比較精確的結果應該是-0.491437。
  3008. ;(1) 標號: FSDT 功能:浮點數格式化
  3009. ;入口條件:待格式化浮點操作數在[R0]中。
  3010. ;出口信息:已格式化浮點操作數仍在[R0]中。
  3011. ;影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節
  3012. FSDT: LCALL MVR0 ;將待格式化操作數傳送到第一工作區中
  3013. LCALL RLN ;通過左規完成格式化
  3014. LJMP MOV0 ;將已格式化浮點操作數傳回到[R0]中
  3015. ;(2) 標號: FADD 功能:浮點數加法
  3016. ;入口條件:被加數在[R0]中,加數在[R1]中。
  3017. ;出口信息:OV=0時,和仍在[R0]中,OV=1時,溢出。
  3018. ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 6字節
  3019. FADD: CLR F0 ;設立加法標志
  3020. SJMP AS ;計算代數和
  3021. ;(3) 標號: FSUB 功能:浮點數減法
  3022. ;入口條件:被減數在[R0]中,減數在[R1]中。
  3023. ;出口信息:OV=0時,差仍在[R0]中,OV=1時,溢出。
  3024. ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
  3025. FSUB: SETB F0 ;設立減法標志
  3026. AS: LCALL MVR1 ;計算代數和。先將[R1]傳送到第二工作區
  3027. MOV C,F0 ;用加減標志來校正第二操作數的有效符號
  3028. RRC A
  3029. XRL A,@R1
  3030. MOV C,ACC.7
  3031. ASN: MOV 1EH,C ;將第二操作數的有效符號存入位1EH中
  3032. XRL A,@R0 ;與第一操作數的符號比較
  3033. RLC A
  3034. MOV F0,C ;保存比較結果
  3035. LCALL MVR0 ;將[R0]傳送到第一工作區中
  3036. LCALL AS1 ;在工作寄存器中完成代數運算
  3037. MOV0: INC R0 ;將結果傳回到[R0]中的子程序入口
  3038. INC R0
  3039. MOV A,R4 ;傳回尾數的低字節
  3040. MOV @R0,A
  3041. DEC R0
  3042. MOV A,R3 ;傳回尾數的高字節
  3043. MOV @R0,A
  3044. DEC R0
  3045. MOV A,R2 ;取結果的階碼
  3046. MOV C,1FH ;取結果的數符
  3047. MOV ACC.7,C ;拼入階碼中
  3048. MOV @R0,A
  3049. CLR ACC.7 ;不考慮數符
  3050. CLR OV ;清除溢出標志
  3051. CJNE A,#3FH,MV01;階碼是否上溢?
  3052. SETB OV ;設立溢出標志
  3053. MV01: MOV A,@R0 ;取出帶數符的階碼
  3054. RET
  3055. MVR0: MOV A,@R0 ;將[R0]傳送到第一工作區中的子程序
  3056. MOV C,ACC.7 ;將數符保存在位1FH中
  3057. MOV 1FH,C
  3058. MOV C,ACC.6 ;將階碼擴充為8bit補碼
  3059. MOV ACC.7,C
  3060. MOV R2,A ;存放在R2中
  3061. INC R0
  3062. MOV A,@R0 ;將尾數高字節存放在R3中
  3063. MOV R3,A
  3064. INC R0
  3065. MOV A,@R0 ;將尾數低字節存放在R4中
  3066. MOV R4,A
  3067. DEC R0 ;恢復數據指針
  3068. DEC R0
  3069. RET
  3070. MVR1: MOV A,@R1 ;將[R1]傳送到第二工作區中的子程序
  3071. MOV C,ACC.7 ;將數符保存在位1EH中
  3072. MOV 1EH,C
  3073. MOV C,ACC.6 ;將階碼擴充為8bit補碼
  3074. MOV ACC.7,C
  3075. MOV R5,A ;存放在R5中
  3076. INC R1
  3077. MOV A,@R1 ;將尾數高字節存放在R6中
  3078. MOV R6,A
  3079. INC R1
  3080. MOV A,@R1 ;將尾數低字節存放在R7中
  3081. MOV R7,A
  3082. DEC R1 ;恢復數據指針
  3083. DEC R1
  3084. RET
  3085. AS1: MOV A,R6 ;讀取第二操作數尾數高字節
  3086. ORL A,R7
  3087. JZ AS2 ;第二操作數為零,不必運算
  3088. MOV A,R3 ;讀取第一操作數尾數高字節
  3089. ORL A,R4
  3090. JNZ EQ1
  3091. MOV A,R6 ;第一操作數為零,結果以第二操作數為準
  3092. MOV R3,A
  3093. MOV A,R7
  3094. MOV R4,A
  3095. MOV A,R5
  3096. MOV R2,A
  3097. MOV C,1EH
  3098. MOV 1FH,C
  3099. AS2: RET
  3100. EQ1: MOV A,R2 ;對階,比較兩個操作數的階碼
  3101. XRL A,R5
  3102. JZ AS4 ;階碼相同,對階結束
  3103. JB ACC.7,EQ3;階符互異
  3104. MOV A,R2 ;階符相同,比較大小
  3105. CLR C
  3106. SUBB A,R5
  3107. JC EQ4
  3108. EQ2: CLR C ;第二操作數右規一次
  3109. MOV A,R6 ;尾數縮小一半
  3110. RRC A
  3111. MOV R6,A
  3112. MOV A,R7
  3113. RRC A
  3114. MOV R7,A
  3115. INC R5 ;階碼加一
  3116. ORL A,R6 ;尾數為零否?
  3117. JNZ EQ1 ;尾數不為零,繼續對階
  3118. MOV A,R2 ;尾數為零,提前結束對階
  3119. MOV R5,A
  3120. SJMP AS4
  3121. EQ3: MOV A,R2 ;判斷第一操作數階符
  3122. JNB ACC.7,EQ2;如為正,右規第二操作數
  3123. EQ4: CLR C
  3124. LCALL RR1 ;第一操作數右規一次
  3125. ORL A,R3 ;尾數為零否?
  3126. JNZ EQ1 ;不為零,繼續對階
  3127. MOV A,R5 ;尾數為零,提前結束對階
  3128. MOV R2,A
  3129. AS4: JB F0,AS5 ;尾數加減判斷
  3130. MOV A,R4 ;尾數相加
  3131. ADD A,R7
  3132. MOV R4,A
  3133. MOV A,R3
  3134. ADDC A,R6
  3135. MOV R3,A
  3136. JNC AS2
  3137. LJMP RR1 ;有進位,右規一次
  3138. AS5: CLR C ;比較絕對值大小
  3139. MOV A,R4
  3140. SUBB A,R7
  3141. MOV B,A
  3142. MOV A,R3
  3143. SUBB A,R6
  3144. JC AS6
  3145. MOV R4,B ;第一尾數減第二尾數
  3146. MOV R3,A
  3147. LJMP RLN ;結果規格化
  3148. AS6: CPL 1FH ;結果的符號與第一操作數相反
  3149. CLR C ;結果的絕對值為第二尾數減第一尾數
  3150. MOV A,R7
  3151. SUBB A,R4
  3152. MOV R4,A
  3153. MOV A,R6
  3154. SUBB A,R3
  3155. MOV R3,A
  3156. RLN: MOV A,R3 ;浮點數規格化
  3157. ORL A,R4 ;尾數為零否?
  3158. JNZ RLN1
  3159. MOV R2,#0C1H;階碼取最小值
  3160. RET
  3161. RLN1: MOV A,R3
  3162. JB ACC.7,RLN2;尾數最高位為一否?
  3163. CLR C ;不為一,左規一次
  3164. LCALL RL1
  3165. SJMP RLN ;繼續判斷
  3166. RLN2: CLR OV ;規格化結束
  3167. RET
  3168. RL1: MOV A,R4 ;第一操作數左規一次
  3169. RLC A ;尾數擴大一倍
  3170. MOV R4,A
  3171. MOV A,R3
  3172. RLC A
  3173. MOV R3,A
  3174. DEC R2 ;階碼減一
  3175. CJNE R2,#0C0H,RL1E;階碼下溢否?
  3176. CLR A
  3177. MOV R3,A ;階碼下溢,操作數以零計
  3178. MOV R4,A
  3179. MOV R2,#0C1H
  3180. RL1E: CLR OV
  3181. RET
  3182. RR1: MOV A,R3 ;第一操作數右規一次
  3183. RRC A ;尾數縮小一半
  3184. MOV R3,A
  3185. MOV A,R4
  3186. RRC A
  3187. MOV R4,A
  3188. INC R2 ;階碼加一
  3189. CLR OV ;清溢出標志
  3190. CJNE R2,#40H,RR1E;階碼上溢否?
  3191. MOV R2,#3FH ;階碼溢出
  3192. SETB OV
  3193. RR1E: RET
  3194. ;(4) 標號: FMUL 功能:浮點數乘法
  3195. ;入口條件:被乘數在[R0]中,乘數在[R1]中。
  3196. ;出口信息:OV=0時,積仍在[R0]中,OV=1時,溢出。
  3197. ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
  3198. FMUL: LCALL MVR0 ;將[R0]傳送到第一工作區中
  3199. MOV A,@R0
  3200. XRL A,@R1 ;比較兩個操作數的符號
  3201. RLC A
  3202. MOV 1FH,C ;保存積的符號
  3203. LCALL MUL0 ;計算積的絕對值
  3204. LJMP MOV0 ;將結果傳回到[R0]中
  3205. MUL0: LCALL MVR1 ;將[R1]傳送到第二工作區中
  3206. MUL1: MOV A,R3 ;第一尾數為零否?
  3207. ORL A,R4
  3208. JZ MUL6
  3209. MOV A,R6 ;第二尾數為零否?
  3210. ORL A,R7
  3211. JZ MUL5
  3212. MOV A,R7 ;計算R3R4×R6R7-→R3R4
  3213. MOV B,R4
  3214. MUL AB
  3215. MOV A,B
  3216. XCH A,R7
  3217. MOV B,R3
  3218. MUL AB
  3219. ADD A,R7
  3220. MOV R7,A
  3221. CLR A
  3222. ADDC A,B
  3223. XCH A,R4
  3224. MOV B,R6
  3225. MUL AB
  3226. ADD A,R7
  3227. MOV R7,A
  3228. MOV A,B
  3229. ADDC A,R4
  3230. MOV R4,A
  3231. CLR A
  3232. RLC A
  3233. XCH A,R3
  3234. MOV B,R6
  3235. MUL AB
  3236. ADD A,R4
  3237. MOV R4,A
  3238. MOV A,B
  3239. ADDC A,R3
  3240. MOV R3,A
  3241. JB ACC.7,MUL2;積為規格化數否?
  3242. MOV A,R7 ;左規一次
  3243. RLC A
  3244. MOV R7,A
  3245. LCALL RL1
  3246. MUL2: MOV A,R7
  3247. JNB ACC.7,MUL3
  3248. INC R4
  3249. MOV A,R4
  3250. JNZ MUL3
  3251. INC R3
  3252. MOV A,R3
  3253. JNZ MUL3
  3254. MOV R3,#80H
  3255. INC R2
  3256. MUL3: MOV A,R2 ;求積的階碼
  3257. ADD A,R5
  3258. MD: MOV R2,A ;階碼溢出判斷
  3259. JB ACC.7,MUL4
  3260. JNB ACC.6,MUL6
  3261. MOV R2,#3FH ;階碼上溢,設立標志
  3262. SETB OV
  3263. RET
  3264. MUL4: JB ACC.6,MUL6
  3265. MUL5: CLR A ;結果清零(因子為零或階碼下溢)
  3266. MOV R3,A
  3267. MOV R4,A
  3268. MOV R2,#41H
  3269. MUL6: CLR OV
  3270. RET
  3271. ;(5) 標號: FDIV 功能:浮點數除法
  3272. ;入口條件:被除數在[R0]中,除數在[R1]中。
  3273. ;出口信息:OV=0時,商仍在[R0]中,OV=1時,溢出。
  3274. ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節
  3275. FDIV: INC R0
  3276. MOV A,@R0
  3277. INC R0
  3278. ORL A,@R0
  3279. DEC R0
  3280. DEC R0
  3281. JNZ DIV1
  3282. MOV @R0,#41H;被除數為零,不必運算
  3283. CLR OV
  3284. RET
  3285. DIV1: INC R1
  3286. MOV A,@R1
  3287. INC R1
  3288. ORL A,@R1
  3289. DEC R1
  3290. DEC R1
  3291. JNZ DIV2
  3292. SETB OV ;除數為零,溢出
  3293. RET
  3294. DIV2: LCALL MVR0 ;將[R0]傳送到第一工作區中
  3295. MOV A,@R0
  3296. XRL A,@R1 ;比較兩個操作數的符號
  3297. RLC A
  3298. MOV 1FH,C ;保存結果的符號
  3299. LCALL MVR1 ;將[R1]傳送到第二工作區中
  3300. LCALL DIV3 ;調用工作區浮點除法
  3301. LJMP MOV0 ;回傳結果
  3302. DIV3: CLR C ;比較尾數的大小
  3303. MOV A,R4
  3304. SUBB A,R7
  3305. MOV A,R3
  3306. SUBB A,R6
  3307. JC DIV4
  3308. LCALL RR1 ;被除數右規一次
  3309. SJMP DIV3
  3310. DIV4: CLR A ;借用R0R1R2作工作寄存器
  3311. XCH A,R0 ;清零并保護之
  3312. PUSH ACC
  3313. CLR A
  3314. XCH A,R1
  3315. PUSH ACC
  3316. MOV A,R2
  3317. PUSH ACC
  3318. MOV B,#10H ;除法運算,R3R4/R6R7-→R0R1
  3319. DIV5: CLR C
  3320. MOV A,R1
  3321. RLC A
  3322. MOV R1,A
  3323. MOV A,R0
  3324. RLC A
  3325. MOV R0,A
  3326. MOV A,R4
  3327. RLC A
  3328. MOV R4,A
  3329. XCH A,R3
  3330. RLC A
  3331. XCH A,R3
  3332. MOV F0,C
  3333. CLR C
  3334. SUBB A,R7
  3335. MOV R2,A
  3336. MOV A,R3
  3337. SUBB A,R6
  3338. ANL C,/F0
  3339. JC DIV6
  3340. MOV R3,A
  3341. MOV A,R2
  3342. MOV R4,A
  3343. INC R1
  3344. DIV6: DJNZ B,DIV5
  3345. MOV A,R6 ;四舍五入
  3346. CLR C
  3347. RRC A
  3348. SUBB A,R3
  3349. CLR A
  3350. ADDC A,R1 ;將結果存回R3R4
  3351. MOV R4,A
  3352. CLR A
  3353. ADDC A,R0
  3354. MOV R3,A
  3355. POP ACC ;恢復R0R1R2
  3356. MOV R2,A
  3357. POP ACC
  3358. MOV R1,A
  3359. POP ACC
  3360. MOV R0,A
  3361. MOV A,R2 ;計算商的階碼
  3362. CLR C
  3363. SUBB A,R5
  3364. LCALL MD ;階碼檢驗
  3365. LJMP RLN ;規格化
  3366. ;(6) 標號: FCLR 功能:浮點數清零
  3367. ;入口條件:操作數在[R0]中。
  3368. ;出口信息:操作數被清零。
  3369. ;影響資源:A 堆棧需求: 2字節
  3370. FCLR: INC R0
  3371. INC R0
  3372. CLR A
  3373. MOV @R0,A
  3374. DEC R0
  3375. MOV @R0,A
  3376. DEC R0
  3377. MOV @R0,#41H
  3378. RET
  3379. ;(7) 標號: FZER 功能:浮點數判零
  3380. ;入口條件:操作數在[R0]中。
  3381. ;出口信息:若累加器A為零,則操作數[R0]為零,否則不為零。
  3382. ;影響資源:A 堆棧需求: 2字節
  3383. FZER: INC R0
  3384. INC R0
  3385. MOV A,@R0
  3386. DEC R0
  3387. ORL A,@R0
  3388. DEC R0
  3389. JNZ ZERO
  3390. MOV @R0,#41H
  3391. ZERO: RET
  3392. ;(8) 標號: FMOV 功能:浮點數傳送
  3393. ;入口條件:源操作數在[R1]中,目標地址為[R0]。
  3394. ;出口信息:[R0]=[R1],[R1]不變。
  3395. ;影響資源:A 堆棧需求: 2字節
  3396. FMOV: INC R0
  3397. INC R0
  3398. INC R1
  3399. INC R1
  3400. MOV A,@R1
  3401. MOV @R0,A
  3402. DEC R0
  3403. DEC R1
  3404. MOV A,@R1
  3405. MOV @R0,A
  3406. DEC R0
  3407. DEC R1
  3408. MOV A,@R1
  3409. MOV @R0,A
  3410. RET
  3411. ;(9) 標號: FPUS 功能:浮點數壓棧
  3412. ;入口條件:操作數在[R0]中。
  3413. ;出口信息:操作數壓入棧頂。
  3414. ;影響資源:A、R2、R3 堆棧需求: 5字節
  3415. FPUS: POP ACC ;將返回地址保存在R2R3中
  3416. MOV R2,A
  3417. POP ACC
  3418. MOV R3,A
  3419. MOV A,@R0 ;將操作數壓入堆棧
  3420. PUSH ACC
  3421. INC R0
  3422. MOV A,@R0
  3423. PUSH ACC
  3424. INC R0
  3425. MOV A,@R0
  3426. PUSH ACC
  3427. DEC R0
  3428. DEC R0
  3429. MOV A,R3 ;將返回地址壓入堆棧
  3430. PUSH ACC
  3431. MOV A,R2
  3432. PUSH ACC
  3433. RET ;返回主程序
  3434. ;(10) 標號: FPOP 功能:浮點數出棧
  3435. ;入口條件:操作數處于棧頂。
  3436. ;出口信息:操作數彈至[R0]中。
  3437. ;影響資源:A、R2、R3 堆棧需求: 2字節
  3438. FPOP: POP ACC ;將返回地址保存在R2R3中
  3439. MOV R2,A
  3440. POP ACC
  3441. MOV R3,A
  3442. INC R0
  3443. INC R0
  3444. POP ACC ;將操作數彈出堆棧,傳送到[R0]中
  3445. MOV @R0,A
  3446. DEC R0
  3447. POP ACC
  3448. MOV @R0,A
  3449. DEC R0
  3450. POP ACC
  3451. MOV @R0,A
  3452. MOV A,R3 ;將返回地址壓入堆棧
  3453. PUSH ACC
  3454. MOV A,R2
  3455. PUSH ACC
  3456. RET ;返回主程序
  3457. ;(11) 標號: FCMP 功能:浮點數代數值比較(不影響待比較操作數)
  3458. ;入口條件:待比較操作數分別在[R0]和[R1]中。
  3459. ;出口信息:若CY=1,則[R0] < [R1],若CY=0且A=0則 [R0] = [R1],否則[R0] > [R1]。
  3460. ;影響資源:A、B、PSW 堆棧需求: 2字節
  3461. FCMP: MOV A,@R0 ;數符比較
  3462. XRL A,@R1
  3463. JNB ACC.7,CMP2
  3464. MOV A,@R0 ;兩數異號,以[R0]數符為準
  3465. RLC A
  3466. MOV A,#0FFH
  3467. RET
  3468. CMP2: MOV A,@R1 ;兩數同號,準備比較階碼
  3469. MOV C,ACC.6
  3470. MOV ACC.7,C
  3471. MOV B,A
  3472. MOV A,@R0
  3473. MOV C,ACC.7
  3474. MOV F0,C ;保存[R0]的數符
  3475. MOV C,ACC.6
  3476. MOV ACC.7,C
  3477. CLR C ;比較階碼
  3478. SUBB A,B
  3479. JZ CMP6
  3480. RLC A ;取階碼之差的符號
  3481. JNB F0,CMP5
  3482. CPL C ;[R0]為負時,結果取反
  3483. CMP5: MOV A,#0FFH ;兩數不相等
  3484. RET
  3485. CMP6: INC R0 ;階碼相同時,準備比較尾數
  3486. INC R0
  3487. INC R1
  3488. INC R1
  3489. CLR C
  3490. MOV A,@R0
  3491. SUBB A,@R1
  3492. MOV B,A ;保存部分差
  3493. DEC R0
  3494. DEC R1
  3495. MOV A,@R0
  3496. SUBB A,@R1
  3497. DEC R0
  3498. DEC R1
  3499. ORL A,B ;生成是否相等信息
  3500. JZ CMP7
  3501. JNB F0,CMP7
  3502. CPL C ;[R0]為負時,結果取反
  3503. CMP7: RET
  3504. ;(12) 標號: FABS 功能:浮點絕對值函數
  3505. ;入口條件:操作數在[R0]中。
  3506. ;出口信息:結果仍在[R0]中。
  3507. ;影響資源:A 堆棧需求: 2字節
  3508. FABS:         MOV A,@R0         ;讀取操作數的階碼
  3509.         CLR ACC.7         ;清除數符
  3510.         MOV @R0,A         ;回傳階碼
  3511.         RET
  3512. ;(13) 標號: FSGN 功能:浮點符號函數
  3513. ;入口條件:操作數在[R0]中。
  3514. ;出口信息:累加器 A=1 時為正數,A=0FFH時為負數,A=0 時為零。
  3515. ;影響資源:PSW、A 堆棧需求: 2字節
  3516. FSGN: INC R0 ;讀尾數
  3517. MOV A,@R0
  3518. INC R0
  3519. ORL A,@R0
  3520. DEC R0
  3521. DEC R0
  3522. JNZ SGN
  3523. RET ;尾數為零,結束
  3524. SGN: MOV A,@R0 ;讀取操作數的階碼
  3525. RLC A ;取數符
  3526. MOV A,#1 ;按正數初始化
  3527. JNC SGN1 ;是正數,結束
  3528. MOV A,#0FFH ;是負數,改變標志
  3529. SGN1: RET
  3530. ;(14) 標號: FINT 功能:浮點取整函數
  3531. ;入口條件:操作數在[R0]中。
  3532. ;出口信息:結果仍在[R0]中。
  3533. ;影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節
  3534. FINT: LCALL MVR0 ;將[R0]傳送到第一工作區中
  3535. LCALL INT ;在工作寄存器中完成取整運算
  3536. LJMP MOV0 ;將結果傳回到[R0]中
  3537. INT: MOV A,R3
  3538. ORL A,R4
  3539. JNZ INTA
  3540. CLR 1FH ;尾數為零,階碼也清零,結束取整
  3541. MOV R2,#41H
  3542. RET
  3543. INTA: MOV A,R2
  3544. JZ INTB ;階碼為零否?
  3545. JB ACC.7,INTB;階符為負否?
  3546. CLR C
  3547. SUBB A,#10H ;階碼小于16否?
  3548. JC INTD
  3549. RET ;階碼大于16,已經是整數
  3550. INTB: CLR A ;絕對值小于一,取整后正數為零,負數為負一
  3551. MOV R4,A
  3552. MOV C,1FH
  3553. RRC A
  3554. MOV R3,A
  3555. RL A
  3556. MOV R2,A
  3557. JNZ INTC
  3558. MOV R2,#41H
  3559. INTC: RET
  3560. INTD: CLR F0 ;舍尾標志初始化
  3561. INTE: CLR C
  3562. LCALL RR1 ;右規一次
  3563. ORL C,F0 ;記憶舍尾情況
  3564. MOV F0,C
  3565. CJNE R2,#10H,INTE;階碼達到16(尾數完全為整數)否?
  3566. JNB F0,INTF ;舍去部分為零否?
  3567. JNB 1FH,INTF;操作數為正數否?
  3568. INC R4 ;對于帶小數的負數,向下取整
  3569. MOV A,R4
  3570. JNZ INTF
  3571. INC R3
  3572. INTF: LJMP RLN ;將結果規格化
  3573. ;(15) 標號: FRCP 功能:浮點倒數函數
  3574. ;入口條件:操作數在[R0]中。
  3575. ;出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
  3576. ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 5字節
  3577. FRCP: MOV A,@R0
  3578. MOV C,ACC.7
  3579. MOV 1FH,C ;保存數符
  3580. MOV C,ACC.6 ;絕對值傳送到第二工作區
  3581. MOV ACC.7,C
  3582. MOV R5,A
  3583. INC R0
  3584. MOV A,@R0
  3585. MOV R6,A
  3586. INC R0
  3587. MOV A,@R0
  3588. MOV R7,A
  3589. DEC R0
  3590. DEC R0
  3591. ORL A,R6
  3592. JNZ RCP
  3593. SETB OV ;零不能求倒數,設立溢出標志
  3594. RET
  3595. RCP: MOV A,R6
  3596. JB ACC.7,RCP2;操作數格式化否?
  3597. CLR C ;格式化之
  3598. MOV A,R7
  3599. RLC A
  3600. MOV R7,A
  3601. MOV A,R6
  3602. RLC A
  3603. MOV R6,A
  3604. DEC R5
  3605. SJMP RCP
  3606. RCP2: MOV R2,#1 ;將數值1.00傳送到第一工作區
  3607. MOV R3,#80H
  3608. MOV R4,#0
  3609. LCALL DIV3 ;調用工作區浮點除法,求得倒數
  3610. LJMP MOV0 ;回傳結果
  3611. ;(16) 標號: FSQU 功能:浮點數平方
  3612. ;入口條件:操作數在[R0]中。
  3613. ;出口信息:OV=0時,平方值仍然在[R0]中,OV=1時溢出。
  3614. ;影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 9字節
  3615. FSQU: MOV A,R0 ;將操作數
  3616. XCH A,R1 ;同時作為乘數
  3617. PUSH ACC ;保存R1指針
  3618. LCALL FMUL ;進行乘法運算
  3619. POP ACC
  3620. MOV R1,A ;恢復R1指針
  3621. RET
  3622. ;(17) 標號: FSQR 功能:浮點數開平方(快速逼近算法)
  3623. ;入口條件:操作數在[R0]中。
  3624. ;出口信息:OV=0時,平方根仍在[R0]中,OV=1時,負數開平方出錯。
  3625. ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節
  3626. FSQR: MOV A,@R0
  3627. JNB ACC.7,SQR
  3628. SETB OV ;負數開平方,出錯
  3629. RET
  3630. SQR: INC R0
  3631. INC R0
  3632. MOV A,@R0
  3633. DEC R0
  3634. ORL A,@R0
  3635. DEC R0
  3636. JNZ SQ
  3637. MOV @R0,#41H;尾數為零,不必運算
  3638. CLR OV
  3639. RET
  3640. SQ: MOV A,@R0
  3641. MOV C,ACC.6 ;將階碼擴展成8bit補碼
  3642. MOV ACC.7,C
  3643. INC A ;加一
  3644. CLR C
  3645. RRC A ;除二
  3646. MOV @R0,A ;得到平方根的階碼,回存之
  3647. INC R0 ;指向被開方數尾數的高字節
  3648. JC SQR0 ;原被開方數的階碼是奇數嗎?
  3649. MOV A,@R0 ;是奇數,尾數右規一次
  3650. RRC A
  3651. MOV @R0,A
  3652. INC R0
  3653. MOV A,@R0
  3654. RRC A
  3655. MOV @R0,A
  3656. DEC R0
  3657. SQR0: MOV A,@R0
  3658. JZ SQR9 ;尾數為零,不必運算
  3659. MOV R2,A ;將尾數傳送到R2R3中
  3660. INC R0
  3661. MOV A,@R0
  3662. MOV R3,A
  3663. MOV A,R2 ;快速開方,參閱定點子程序說明
  3664. ADD A,#57H
  3665. JC SQR2
  3666. ADD A,#45H
  3667. JC SQR1
  3668. ADD A,#24H
  3669. MOV B,#0E3H
  3670. MOV R4,#80H
  3671. SJMP SQR3
  3672. SQR1: MOV B,#0B2H
  3673. MOV R4,#0A0H
  3674. SJMP SQR3
  3675. SQR2: MOV B,#8DH
  3676. MOV R4,#0D0H
  3677. SQR3: MUL AB
  3678. MOV A,B
  3679. ADD A,R4
  3680. MOV R4,A
  3681. MOV B,A
  3682. MUL AB
  3683. XCH A,R3
  3684. CLR C
  3685. SUBB A,R3
  3686. MOV R3,A
  3687. MOV A,B
  3688. XCH A,R2
  3689. SUBB A,R2
  3690. MOV R2,A
  3691. SQR4: SETB C
  3692. MOV A,R4
  3693. RLC A
  3694. MOV R6,A
  3695. CLR A
  3696. RLC A
  3697. MOV R5,A
  3698. MOV A,R3
  3699. SUBB A,R6
  3700. MOV B,A
  3701. MOV A,R2
  3702. SUBB A,R5
  3703. JC SQR5
  3704. INC R4
  3705. MOV R2,A
  3706. MOV R3,B
  3707. SJMP SQR4
  3708. SQR5: MOV A,R4
  3709. XCH A,R2
  3710. RRC A
  3711. MOV F0,C
  3712. MOV A,R3
  3713. MOV R5,A
  3714. MOV R4,#8
  3715. SQR6: CLR C
  3716. MOV A,R3
  3717. RLC A
  3718. MOV R3,A
  3719. CLR C
  3720. MOV A,R5
  3721. SUBB A,R2
  3722. JB F0,SQR7
  3723. JC SQR8
  3724. SQR7: MOV R5,A
  3725. INC R3
  3726. SQR8: CLR C
  3727. MOV A,R5
  3728. RLC A
  3729. MOV R5,A
  3730. MOV F0,C
  3731. DJNZ R4,SQR6
  3732. MOV A,R3 ;將平方根的尾數回傳到[R0]中
  3733. MOV @R0,A
  3734. DEC R0
  3735. MOV A,R2
  3736. MOV @R0,A
  3737. SQR9: DEC R0 ;數據指針回歸原位
  3738. CLR OV ;開方結果有效
  3739. RET
  3740. ;(18) 標號: FPLN 功能:浮點數多項式計算
  3741. ;入口條件:自變量在[R0]中,多項式系數在調用指令之后,以40H結束。
  3742. ;出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
  3743. ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 4字節
  3744. FPLN: POP DPH ;取出多項式系數存放地址
  3745. POP DPL
  3746. XCH A,R0 ;R0、R1交換角色,自變量在[R1]中
  3747. XCH A,R1
  3748. XCH A,R0
  3749. CLR A ;清第一工作區
  3750. MOV R2,A
  3751. MOV R3,A
  3752. MOV R4,A
  3753. CLR 1FH
  3754. PLN1: CLR A ;讀取一個系數,并裝入第二工作區
  3755. MOVC A,@A+DPTR
  3756. MOV C,ACC.7
  3757. MOV 1EH,C
  3758. MOV C,ACC.6
  3759. MOV ACC.7,C
  3760. MOV R5,A
  3761. INC DPTR
  3762. CLR A
  3763. MOVC A,@A+DPTR
  3764. MOV R6,A
  3765. INC DPTR
  3766. CLR A
  3767. MOVC A,@A+DPTR
  3768. MOV R7,A
  3769. INC DPTR ;指向下一個系數
  3770. MOV C,1EH ;比較兩個數符
  3771. RRC A
  3772. XRL A,23H
  3773. RLC A
  3774. MOV F0,C ;保存比較結果
  3775. LCALL AS1 ;進行代數加法運算
  3776. CLR A ;讀取下一個系數的第一個字節
  3777. MOVC A,@A+DPTR
  3778. CJNE A,#40H,PLN2;是結束標志嗎?
  3779. XCH A,R0 ;運算結束,恢復R0、R1原來的角色
  3780. XCH A,R1
  3781. XCH A,R0
  3782. LCALL MOV0 ;將結果回傳到[R0]中
  3783. CLR A
  3784. INC DPTR
  3785. JMP @A+DPTR ;返回主程序
  3786. PLN2: MOV A,@R1 ;比較自變量和中間結果的符號
  3787. XRL A,23H
  3788. RLC A
  3789. MOV 1FH,C ;保存比較結果
  3790. LCALL MUL0 ;進行乘法運算
  3791. SJMP PLN1 ;繼續下一項運算
  3792. ;(19) 標號: FLOG 功能:以10為底的浮點對數函數
  3793. ;入口條件:操作數在[R0]中。
  3794. ;出口信息:OV=0時,結果仍在[R0]中,OV=1時,負數或零求對數出錯。
  3795. ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:9字節
  3796. FLOG: LCALL FLN ;先以e為底求對數
  3797. JNB OV,LOG
  3798. RET ;如溢出則停止計算
  3799. LOG: MOV R5,#0FFH;系數0.43430(1/Ln10)
  3800. MOV R6,#0DEH
  3801. MOV R7,#5CH
  3802. LCALL MUL1 ;通過相乘來換底
  3803. LJMP MOV0 ;傳回結果
  3804. ;(20) 標號: FLN 功能:以e為底的浮點對數函數
  3805. ;入口條件:操作數在[R0]中。
  3806. ;出口信息:OV=0時,結果仍在[R0]中,OV=1時,負數或零求對數出錯。
  3807. ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求: 7字節
  3808. FLN: LCALL MVR0 ;將[R0]傳送到第一工作區
  3809. JB 1FH,LNOV;負數或零求對數,出錯
  3810. MOV A,R3
  3811. ORL A,R4
  3812. JNZ LN0
  3813. LNOV: SETB OV
  3814. RET
  3815. LN0: CLR C
  3816. LCALL RL1 ;左規一次
  3817. CLR A
  3818. XCH A,R2 ;保存原階碼,清零工作區的階碼
  3819. PUSH ACC
  3820. LCALL RLN ;規格化
  3821. LCALL MOV0 ;回傳
  3822. LCALL FPLN ;用多項式計算尾數的對數
  3823. DB 7BH,0F4H,30H;0.029808
  3824. DB 0FEH,85H,13H;-0.12996
  3825. DB 7FH,91H,51H;0.28382
  3826. DB 0FFH,0FAH,0BAH;-0.4897
  3827. DB 0,0FFH,0CAH;0.99918
  3828. DB 70H,0C0H,0;1.1442×10-5
  3829. DB 40H ;結束
  3830. POP ACC ;取出原階碼
  3831. JNZ LN1
  3832. RET ;如為零,則結束
  3833. LN1: CLR 1EH ;清第二區數符
  3834. MOV C,ACC.7
  3835. MOV F0,C ;保存階符
  3836. JNC LN2
  3837. CPL A ;當階碼為負時,求其絕對值
  3838. INC A
  3839. LN2: MOV R2,A ;階碼的絕對值乘以0.69315
  3840. MOV B,#72H
  3841. MUL AB
  3842. XCH A,R2
  3843. MOV R7,B
  3844. MOV B,#0B1H
  3845. MUL AB
  3846. ADD A,R7
  3847. MOV R7,A ;乘積的尾數在R6R7R2中
  3848. CLR A
  3849. ADDC A,B
  3850. MOV R6,A
  3851. MOV R5,#8 ;乘積的階碼初始化(整數部分為一字節)
  3852. LN3: JB ACC.7,LN4;乘積格式化
  3853. MOV A,R2
  3854. RLC A
  3855. MOV R2,A
  3856. MOV A,R7
  3857. RLC A
  3858. MOV R7,A
  3859. MOV A,R6
  3860. RLC A
  3861. MOV R6,A
  3862. DEC R5
  3863. SJMP LN3
  3864. LN4: MOV C,F0 ;取出階符,作為乘積的數符
  3865. MOV ACC.7,C
  3866. LJMP ASN ;與尾數的對數合并,得原操作數的對數
  3867. ;(21) 標號: FE10 功能:以10為底的浮點指數函數
  3868. ;入口條件:操作數在[R0]中。
  3869. ;出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
  3870. ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
  3871. FE10: MOV R5,#2 ;加權系數為3.3219(Log210)
  3872. MOV R6,#0D4H
  3873. MOV R7,#9AH
  3874. SJMP EXP ;先進行加權運算,后以2為底統一求冪
  3875. ;(22) 標號: FEXP 功能:以e為底的浮點指數函數
  3876. ;入口條件:操作數在[R0]中。
  3877. ;出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
  3878. ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
  3879. FEXP: MOV R5,#1 ;加權系數為1.44272(Lng2e)
  3880. MOV R6,#0B8H
  3881. MOV R7,#0ABH
  3882. EXP: CLR 1EH ;加權系數為正數
  3883. LCALL MVR0 ;將[R0]傳送到第一工作區
  3884. LCALL MUL1 ;進行加權運算
  3885. SJMP E20 ;以2為底統一求冪
  3886. ;(23) 標號: FE2 功能:以2為底的浮點指數函數
  3887. ;入口條件:操作數在[R0]中。
  3888. ;出口信息:OV=0時,結果仍在[R0]中,OV=1時,溢出。
  3889. ;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
  3890. FE2: LCALL MVR0 ;將[R0]傳送到第一工作區
  3891. E20: MOV A,R3
  3892. ORL A,R4
  3893. JZ EXP1 ;尾數為零
  3894. MOV A,R2
  3895. JB ACC.7,EXP2;階符為負?
  3896. SETB C
  3897. SUBB A,#6 ;階碼大于6否?
  3898. JC EXP2
  3899. JB 1FH,EXP0;數符為負否?
  3900. MOV @R0,#3FH;正指數過大,冪溢出
  3901. INC R0
  3902. MOV @R0,#0FFH
  3903. INC R0
  3904. MOV @R0,#0FFH
  3905. DEC R0
  3906. DEC R0
  3907. SETB OV
  3908. RET
  3909. EXP0: MOV @R0,#41H;負指數過大,冪下溢,清零處理
  3910. CLR A
  3911. INC R0
  3912. MOV @R0,A
  3913. INC R0
  3914. MOV @R0,A
  3915. DEC R0
  3916. DEC R0
  3917. CLR OV
  3918. RET
  3919. EXP1: MOV @R0,#1 ;指數為零,冪為1.00
  3920. INC R0
  3921. MOV @R0,#80H
  3922. INC R0
  3923. MOV @R0,#0
  3924. DEC R0
  3925. DEC R0
  3926. CLR OV
  3927. RET
  3928. EXP2: MOV A,R2 ;將指數復制到第二工作區
  3929. MOV R5,A
  3930. MOV A,R3
  3931. MOV R6,A
  3932. MOV A,R4
  3933. MOV R7,A
  3934. MOV C,1FH
  3935. MOV 1EH,C
  3936. LCALL INT ;對第一區取整
  3937. MOV A,R3
  3938. JZ EXP4
  3939. EXP3: CLR C ;使尾數高字節R3對應一個字節整數
  3940. RRC A
  3941. INC R2
  3942. CJNE R2,#8,EXP3
  3943. EXP4: MOV R3,A
  3944. JNB 1FH,EXP5
  3945. CPL A ;并用補碼表示
  3946. INC A
  3947. EXP5: PUSH ACC ;暫時保存之
  3948. LCALL RLN ;重新規格化
  3949. CPL 1FH
  3950. SETB F0
  3951. LCALL AS1 ;求指數的小數部分
  3952. LCALL MOV0 ;回傳指數的小數部分
  3953. LCALL FPLN ;通過多項式計算指數的小數部分的冪
  3954. DB 77H,0B1H,0C9H;1.3564×10-3
  3955. DB 7AH,0A1H,68H;9.8514×10-3
  3956. DB 7CH,0E3H,4FH;0.055495
  3957. DB 7EH,0F5H,0E7H;0.24014
  3958. DB 0,0B1H,72H;0.69315
  3959. DB 1,80H,0 ;1.00000
  3960. DB 40H ;結束
  3961. POP ACC ;取出指數的整數部分
  3962. ADD A,R2 ;按補碼加到冪的階碼上
  3963. MOV R2,A
  3964. CLR 1FH ;冪的符號為正
  3965. LJMP MOV0 ;將冪傳回[R0]中
  3966. ;(24)標號: DTOF 功能:雙字節十六進制定點數轉換成格式化浮點數
  3967. ;入口條件:雙字節定點數的絕對值在[R0]中,數符在位1FH中,整數部分的位數在A中。
  3968. ;出口信息:轉換成格式化浮點數在[R0]中(三字節)。
  3969. ;影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節
  3970. DTOF: MOV R2,A ;按整數的位數初始化階碼
  3971. MOV A,@R0 ;將定點數作尾數
  3972. MOV R3,A
  3973. INC R0
  3974. MOV A,@R0
  3975. MOV R4,A
  3976. DEC R0
  3977. LCALL RLN ;進行規格化
  3978. LJMP MOV0 ;傳送結果到[R0]中
  3979. ……………………

  3980. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼



評分

參與人數 3黑幣 +56 收起 理由
345681892 + 5 很給力!
mi30806024 + 1 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:345799 發表于 2018-6-18 22:40 | 顯示全部樓層
挺好用
回復

使用道具 舉報

ID:20672 發表于 2018-8-1 19:42 | 顯示全部樓層
謝謝分享~~~
回復

使用道具 舉報

ID:34017 發表于 2018-11-29 00:08 | 顯示全部樓層
這個非常不錯,不過我記得原來有一個非常全的子程序集
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本a网站| 国产精品久久毛片av大全日韩 | 国产激情一区二区三区 | 欧美一区二区三区在线播放 | 在线观看视频你懂得 | 国产一区二区三区欧美 | 午夜久久久久久久久久一区二区 | 精品一二区| 一区二区三区四区免费在线观看 | 欧美人人 | 色综合久久久 | 久久综合九九 | 中文字幕精品视频 | 婷婷色网 | 国产精品区二区三区日本 | 国产美女久久久 | 日韩电影一区 | 一区二区三区视频在线观看 | 99精品国产一区二区青青牛奶 | 在线国产视频 | 亚洲精品一区二区三区四区高清 | 亚洲免费人成在线视频观看 | 欧美一区二区三区四区视频 | 精品美女久久久久久免费 | 丁香婷婷成人 | 天天操天天天 | 欧美日韩高清免费 | 日韩三区 | 一级黄色片在线免费观看 | 欧美在线视频二区 | 五月婷婷丁香婷婷 | 亚洲美女一区 | 日韩电影一区二区三区 | 国产一区二区三区久久 | 欧美理论片在线 | 夜色www国产精品资源站 | 久久久久久亚洲精品 | 久久成人18免费网站 | 成人国产精品久久久 | 成人免费观看男女羞羞视频 | 在线一区视频 |