鱼C论坛

 找回密码
 立即注册
查看: 3429|回复: 9

[已解决]两个数的四则运算

[复制链接]
发表于 2020-11-2 21:59:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

从键盘输入两个数字(可正可负),分别输出这两个数字的四则运算表达式
最佳答案
2020-11-7 09:48:51
本帖最后由 xieglt 于 2020-11-7 10:15 编辑

这个代码好麻烦,本来想写个任意数的加减乘除。一直有错误,只好写了个控制在[-65535,65535]之间的加减乘除。
这么麻烦的作业,要提前做准备。

  1. assume cs:code,ds:data

  2. data segment
  3.         Numeric  STRUC
  4.                 Integer        DW  0,0,0
  5.                 Signed        DW        0
  6.         Numeric        ENDS

  7.         num_1        Numeric <>
  8.         num_2        Numeric <>
  9.         num_3        Numeric <>

  10.         buffer        DB        8 dup(0)
  11.     msg1 db 'Input a number[-65535,65535]:',36
  12.         msg2 db 'Please input a rightful number!',0ah,0dh,36
  13.         msg3 db 'The number is too big!',0ah,0dh,36
  14.         msg4 db 'divider can not be zero!',0ah,0dh,36
  15. data ends

  16. code segment
  17. _Break                MACRO
  18.         NOP
  19.         INT                1H
  20.         NOP
  21.                         ENDM

  22. _EnterLine        MACRO
  23.         MOV                AH,02
  24.         MOV                DL,0AH
  25.         INT                21H
  26.         MOV                DL,0DH
  27.         INT                21H
  28.                         ENDM

  29. _PushAll        MACRO
  30.         PUSH        SI
  31.         PUSH        DI
  32.         PUSH        BX
  33.         PUSH        CX
  34.         PUSH        DX
  35.                         ENDM

  36. _PopAll                MACRO
  37.         POP                DX
  38.         POP                CX
  39.         POP                BX
  40.         POP                DI
  41.         POP                SI
  42.                         ENDM
  43. _start:
  44.         MOV                AX,DATA
  45.         MOV                DS,AX
  46.         MOV                ES,AX
  47.        
  48.         PUSH        OFFSET num_1
  49.         CALL        _GetNumeric

  50.         PUSH        OFFSET num_2
  51.         CALL        _GetNumeric

  52.         CALL        _CopyNumeric
  53.         PUSH        OFFSET num_2
  54.         PUSH        OFFSET num_3
  55.         CALL        _AddNumeric

  56.         CALL        _CopyNumeric
  57.         PUSH        OFFSET num_2
  58.         PUSH        OFFSET num_3
  59.         CALL        _SubNumeric

  60.         CALL        _CopyNumeric
  61.         PUSH        OFFSET num_2
  62.         PUSH        OFFSET num_3
  63.         CALL        _MulNumeric
  64.        
  65.         CALL        _CopyNumeric
  66.         PUSH        OFFSET num_2
  67.         PUSH        OFFSET num_3
  68.         CALL        _DivNumeric
  69.        
  70.         MOV                AX,4C00H
  71.         INT                21H

  72. _AddNumeric        PROC
  73.         PUSH        BP
  74.         MOV                BP,SP
  75.         _PushAll

  76.         PUSH        [BP+4]
  77.         PUSH        0
  78.         CALL        _OutputNumeric
  79.         MOV                AH,2
  80.         MOV                DL,'+'
  81.         INT                21H
  82.         PUSH        [BP+6]
  83.         PUSH        0
  84.         CALL        _OutputNumeric
  85.         MOV                AH,2
  86.         MOV                DL,'='
  87.         INT                21H
  88.        
  89.         MOV                SI,[BP+4]
  90.         MOV                DI,[BP+6]

  91.         PUSH        [DI]
  92.         PUSH        [SI]

  93.         MOV                AX,[SI].Signed
  94.         SUB                AX,[DI].Signed
  95.        
  96.         TEST        AX,AX
  97.         JE                _AnSameSigned
  98.         CALL        _SimpleSub
  99.         MOV                [SI],AX
  100.         MOV                AX,[SI].Signed
  101.         XOR                AX,DX
  102.         MOV                [SI].Signed,AX
  103.         JMP                _AnEnd
  104. _AnSameSigned:
  105.         CALL        _SimpleAdd
  106.         MOV                [SI],AX
  107.         MOV                [SI+2],DX
  108. _AnEnd:
  109.         PUSH        [BP+4]
  110.         PUSH        0
  111.         CALL        _OutputNumeric
  112.         _EnterLine

  113.         _PopAll
  114.         MOV                SP,BP
  115.         POP                BP
  116.         RET                4
  117. _AddNumeric        ENDP

  118. _SubNumeric        PROC
  119.         PUSH        BP
  120.         MOV                BP,SP
  121.         _PushAll

  122.         PUSH        [BP+4]
  123.         PUSH        0
  124.         CALL        _OutputNumeric
  125.         MOV                AH,2
  126.         MOV                DL,'-'
  127.         INT                21H
  128.         PUSH        [BP+6]
  129.         PUSH        0
  130.         CALL        _OutputNumeric
  131.         MOV                AH,2
  132.         MOV                DL,'='
  133.         INT                21H
  134.        
  135.         MOV                SI,[BP+4]
  136.         MOV                DI,[BP+6]

  137.         PUSH        [DI]
  138.         PUSH        [SI]

  139.         MOV                AX,[SI].Signed
  140.         SUB                AX,[DI].Signed
  141.        
  142.         TEST        AX,AX
  143.         JNE                _SnSameSigned
  144.         CALL        _SimpleSub
  145.         MOV                [SI],AX
  146.         MOV                AX,[SI].Signed
  147.         XOR                AX,DX
  148.         MOV                [SI].Signed,AX
  149.         JMP                _SnEnd
  150. _SnSameSigned:
  151.         CALL        _SimpleAdd
  152.         MOV                [SI],AX
  153.         MOV                [SI+2],DX
  154. _SnEnd:
  155.         PUSH        [BP+4]
  156.         PUSH        0
  157.         CALL        _OutputNumeric
  158.         _EnterLine

  159.         _PopAll
  160.         MOV                SP,BP
  161.         POP                BP
  162.         RET                4
  163. _SubNumeric        ENDP

  164. _MulNumeric        PROC
  165.         PUSH        BP
  166.         MOV                BP,SP
  167.         SUB                SP,20
  168.         PUSH        DS
  169.         PUSH        ES
  170.         _PushAll

  171.         PUSH        [BP+4]
  172.         PUSH        0
  173.         CALL        _OutputNumeric
  174.         MOV                AH,2
  175.         MOV                DL,'*'
  176.         INT                21H
  177.         PUSH        [BP+6]
  178.         PUSH        0
  179.         CALL        _OutputNumeric
  180.         MOV                AH,2
  181.         MOV                DL,'='
  182.         INT                21H

  183.         MOV                WORD PTR [BP-2],0
  184.         MOV                WORD PTR [BP-4],10000
  185.         MOV                SI,[BP+4]
  186.         MOV                DI,[BP+6]

  187.         MOV                AX,[SI].Signed
  188.         XOR                AX,[DI].Signed
  189.         MOV                [SI].Signed,AX

  190.         MOV                AX,[SI]
  191.         MOV                DX,[SI+2]
  192.         MOV                BX,10000
  193.         DIV                BX
  194.         MOV                [SI],DX
  195.         MOV                [SI+2],AX

  196.         MOV                AX,[DI]
  197.         MOV                DX,[DI+2]
  198.         DIV                BX
  199.         MOV                [BP-20],DX
  200.         MOV                [BP-18],AX
  201.        
  202.         MOV                AX,[SI]
  203.         MUL                WORD PTR [BP-20]
  204.         DIV                WORD PTR [BP-4]
  205.         MOV                [BP-16],DX
  206.         MOV                [BP-2],AX
  207.         MOV                AX,[SI+2]
  208.         MUL                WORD PTR [BP-20]
  209.         ADD                AX,[BP-2]
  210.         ADC                DX,0
  211.         DIV                WORD PTR [BP-4]
  212.         MOV                [BP-14],DX
  213.         MOV                [BP-12],AX
  214.        
  215.         MOV                AX,[SI]
  216.         MUL                WORD PTR [BP-18]
  217.         DIV                WORD PTR [BP-4]
  218.         MOV                [BP-10],DX
  219.         MOV                [BP-2],AX
  220.         MOV                AX,[SI+2]
  221.         MUL                WORD PTR [BP-18]
  222.         ADD                AX,[BP-2]
  223.         ADC                DX,0
  224.         DIV                WORD PTR [BP-4]
  225.         MOV                [BP-8],DX
  226.         MOV                [BP-6],AX
  227.                
  228.         MOV                AX,[BP-16]
  229.         MOV                [SI],AX
  230.         XOR                DX,DX
  231.         XOR                BX,BX
  232.         MOV                AX,[BP-14]
  233.         ADD                AX,[BP-10]
  234.         ADC                BX,0
  235.         DIV                WORD PTR [BP-4]
  236.         MOV                [SI+2],DX
  237.         ADD                BX,AX
  238.         MOV                AX,[BP-12]
  239.         ADD                AX,BX
  240.         ADD                AX,[BP-8]
  241.         MOV                [SI+4],AX

  242.         PUSH        SI
  243.         PUSH        1
  244.         CALL        _OutputNumeric
  245.        
  246.         _EnterLine
  247.         _PopAll
  248.         POP                ES
  249.         POP                DS
  250.         ADD                SP,20
  251.         MOV                SP,BP
  252.         POP                BP
  253.         RET                4
  254. _MulNumeric        ENDP

  255. _DivNumeric        PROC
  256.         PUSH        BP
  257.         MOV                BP,SP
  258.         _PushAll

  259.         PUSH        [BP+4]
  260.         PUSH        0
  261.         CALL        _OutputNumeric
  262.         MOV                AH,2
  263.         MOV                DL,'/'
  264.         INT                21H
  265.         PUSH        [BP+6]
  266.         PUSH        0
  267.         CALL        _OutputNumeric
  268.         MOV                AH,2
  269.         MOV                DL,'='
  270.         INT                21H

  271.         MOV                SI,[BP+4]
  272.         MOV                DI,[BP+6]
  273.        
  274.         MOV                BX,[DI]
  275.         TEST        BX,BX
  276.         JNE                _DividerIsNotZero
  277.         MOV                AH,9
  278.         LEA                DX,msg4
  279.         INT                21H
  280.         JMP                _DivEnd
  281. _DividerIsNotZero:
  282.         MOV                AX,[SI].Signed
  283.         XOR                AX,[DI].Signed
  284.         MOV                [SI].Signed,AX
  285.         MOV                AX,[SI]
  286.         XOR                DX,DX
  287.         DIV                BX
  288.         MOV                [SI],AX
  289.         PUSH        [BP+4]
  290.         PUSH        0
  291.         CALL        _OutputNumeric
  292. _DivEnd:
  293.         _EnterLine

  294.         _PopAll
  295.         MOV                SP,BP
  296.         POP                BP
  297.         RET                4
  298. _DivNumeric        ENDP

  299. _SimpleAdd        PROC
  300.         PUSH        BP
  301.         MOV                BP,SP
  302.         XOR                DX,DX
  303.         MOV                AX,[BP+4]
  304.         ADD                AX,[BP+6]
  305.         ADC                DX,0
  306.         MOV                SP,BP
  307.         POP                BP
  308.         RET                4
  309. _SimpleAdd        ENDP

  310. _SimpleSub        PROC
  311.         PUSH        BP
  312.         MOV                BP,SP
  313.         SUB                SP,2

  314.         MOV                WORD PTR [BP-2],0
  315.         MOV                AX,[BP+4]
  316.         MOV                DX,[BP+6]
  317.         CMP                AX,DX
  318.         JAE                _@15
  319.         XCHG        AX,DX
  320.         INC                WORD PTR [BP-2]
  321. _@15:
  322.         SUB                AX,DX
  323.         MOV                DX,WORD PTR [BP-2]
  324.         ADD                SP,2
  325.         MOV                SP,BP
  326.         POP                BP
  327.         RET                4
  328. _SimpleSub        ENDP

  329. _GetNumeric                PROC
  330.         PUSH        BP
  331.         MOV                BP,SP
  332.         SUB                SP,6
  333.         _PushAll

  334.         JMP                _GNBegin
  335. _Number2Big:
  336.         MOV                AH,09H
  337.         LEA                DX,msg3
  338.         INT                21H
  339. _GNBegin:
  340.         CALL        _InputNumber
  341.         MOV                [BP-2],AX
  342.         MOV                WORD PTR [BP-4],0
  343.         MOV                WORD PTR [BP-6],10
  344.         LEA                SI,buffer
  345. _GNLoop:
  346.         XOR                AX,AX
  347.         LODSB
  348.         TEST        AL,AL
  349.         JE                _GNEnd
  350.         SUB                AL,030H
  351.         MOV                BX,AX
  352.         MOV                AX,[BP-4]
  353.         MUL                WORD PTR [BP-6]
  354.         JC                _Number2Big
  355.         ADD                AX,BX
  356.         JC                _Number2Big
  357.         MOV                [BP-4],AX
  358.         JMP                _GNLoop
  359. _GNEnd:
  360.         MOV                SI,[BP+4]
  361.         PUSH        [BP-4]
  362.         POP                [SI].Integer
  363.         PUSH        [BP-2]
  364.         POP                [SI].Signed
  365.        
  366.         _PopAll
  367.         ADD                SP,6
  368.         MOV                SP,BP
  369.         POP                BP
  370.         RET                2
  371. _GetNumeric                ENDP

  372. _InputNumber        PROC
  373.         JMP                _@10
  374. _@9:
  375.         MOV                AH,09
  376.         LEA                DX,msg2
  377.         INT                21H
  378. _@10:
  379.         MOV                AH,09
  380.         LEA                DX,msg1
  381.         INT                21H

  382.         XOR                AX,AX
  383.         MOV                CX,4
  384.         LEA                DI,buffer
  385.         PUSH        DI
  386.         REP                STOSW
  387.         POP                DI

  388.         XOR                CX,CX
  389.         XOR                BX,BX
  390.         MOV                AH,01
  391.         INT                21H
  392.         CMP                AL,'-'
  393.         JNE                _@11
  394.         INC                BX
  395.         JMP                _@12
  396. _@11:
  397.         CMP                AL,'+'
  398.         JNE                _@13
  399. _@12:
  400.         MOV                AH,01H
  401.         INT                21H
  402. _@13:
  403.         CMP                AL,0DH
  404.         JE                _@14
  405.         CMP                AL,'0'
  406.         JL                _@9
  407.         CMP                AL,'9'
  408.         JG                _@9
  409.         STOSB
  410.         INC                CX
  411.         CMP                CX,5
  412.         JGE                _@14
  413.         JMP                _@12
  414. _@14:
  415.         _EnterLine
  416.         MOV                AX,BX
  417.         RET
  418. _InputNumber        ENDP

  419. _OutputNumber        PROC
  420.         PUSH        BP
  421.         MOV                BP,SP
  422.         SUB                SP,4
  423.         _PushAll

  424.         MOV                WORD PTR [BP-2],0
  425.         MOV                WORD PTR [BP-4],1000
  426.         MOV                CX,4
  427.         MOV                AX,[BP+6]
  428. _@1:       
  429.         XOR                DX,DX
  430.         DIV                WORD PTR [BP-4]
  431.         XCHG        AX,DX
  432.         TEST        DX,DX
  433.         JNE                _@2
  434.         MOV                BX,[BP+4]
  435.         ADD                BX,[BP-2]
  436.         TEST        BX,BX
  437.         JE                _@3
  438. _@2:
  439.         PUSH        AX
  440.         MOV                AH,02
  441.         ADD                DL,030H
  442.         INT                21H
  443.         POP                AX
  444.         INC                WORD PTR [BP-2]
  445. _@3:
  446.         PUSH        AX
  447.         XOR                DX,DX
  448.         MOV                AX,[BP-4]
  449.         MOV                BX,10
  450.         DIV                BX
  451.         MOV                [BP-4],AX
  452.         POP                AX
  453.         LOOP        _@1
  454.        
  455.         MOV                AX,WORD PTR [BP-2]
  456.         _PopAll
  457.         ADD                SP,4
  458.         MOV                SP,BP
  459.         POP                BP
  460.         RET                4
  461. _OutputNumber        ENDP

  462. _CopyNumeric        PROC
  463.         LEA                SI,num_1
  464.         LEA                DI,num_3
  465.         MOV                CX,size Numeric
  466.         REP                MOVSB
  467.         RET
  468. _CopyNumeric        ENDP

  469. _OutputNumeric        PROC
  470.         PUSH        BP
  471.         MOV                BP,SP
  472.         SUB                SP,2
  473.         _PushAll

  474.         MOV                WORD PTR [BP-2],0

  475.         MOV                SI,[BP+6]
  476.         MOV                AX,[SI].Signed
  477.         TEST        AX,AX
  478.         JE                _@4
  479.         MOV                AH,2
  480.         MOV                DL,'('
  481.         INT                21H
  482.         MOV                AH,2
  483.         MOV                DL,'-'
  484.         INT                21H
  485. _@4:
  486.         MOV                AX,[BP+4]
  487.         TEST        AX,AX
  488.         JNE                _@5
  489.         MOV                AX,[SI]
  490.         MOV                DX,[SI+2]
  491.         MOV                BX,10000
  492.         DIV                BX
  493.         PUSH        AX
  494.         PUSH        [BP-2]
  495.         CALL        _OutputNumber
  496.         MOV                [BP-2],AX
  497.         PUSH        DX
  498.         PUSH        AX
  499.         CALL        _OutputNumber
  500.         ADD                [BP-2],AX
  501.         JMP                _@7
  502. _@5:
  503.         MOV                CX,3
  504.         ADD                SI,4
  505. _@6:
  506.         MOV                AX,[SI]
  507.         PUSH        AX
  508.         PUSH        [BP-2]
  509.         CALL        _OutputNumber
  510.         ADD                [BP-2],AX
  511.         SUB                SI,2
  512.         LOOP        _@6
  513. _@7:
  514.         MOV                AX,[BP-2]
  515.         TEST        AX,AX
  516.         JNE                _@8
  517.         MOV                AH,2
  518.         MOV                DL,030H
  519.         INT                21H
  520. _@8:
  521.         MOV                SI,[BP+6]
  522.         MOV                AX,[SI].Signed
  523.         TEST        AX,AX
  524.         JE                _OnEnd
  525.         MOV                AH,2
  526.         MOV                DL,')'
  527.         INT                21H
  528. _OnEnd:
  529.         _PopAll
  530.         ADD                SP,2
  531.         MOV                SP,BP
  532.         POP                BP
  533.         RET                4
  534. _OutputNumeric        ENDP
  535. code ends
  536. END _start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-11-2 22:10:18 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-11-2 22:12 编辑
  1. #include<stdio.h>
  2. int main()
  3. {   
  4.     int i;
  5.     double a,b;
  6.     char c,str[4];
  7.     scanf("%lf%lf%s",&a,&b,str);
  8.     for(i = 0;i < 4;i++)
  9.     {
  10.           if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
  11.           {
  12.                 c = str[i];
  13.           }
  14.     }
  15.     if(c == '+')
  16.     {
  17.         printf("%.2f\n",a+b);
  18.     }
  19.     else if(c == '-')
  20.     {
  21.         printf("%.2f\n",a-b);
  22.     }
  23.     else if(c== '*')
  24.     {
  25.         printf("%.2f\n",a*b);
  26.     }
  27.     else if(c== '/')
  28.     {     
  29.         if(b != 0)
  30.         {
  31.             printf("%.2f\n",a/b);
  32.         }
  33.         else
  34.         {
  35.             printf("除数不能为0 !\n");
  36.         }
  37.    }
  38.     return 0;
  39. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 22:17:41 | 显示全部楼层

谢谢你,不过我忘记说了,是用汇编写程序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 22:31:44 | 显示全部楼层
chichengsun 发表于 2020-11-2 22:17
谢谢你,不过我忘记说了,是用汇编写程序

今晚睡觉,明日给你写段代码.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 22:39:45 | 显示全部楼层
xieglt 发表于 2020-11-2 22:31
今晚睡觉,明日给你写段代码.

好的,谢谢你,主要是明天早上一二节课要上交这次的代码作业,我自己写不出来,所以现在很慌,你明天如果可以早的话,希望你能尽量早一点,麻烦你了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-2 23:34:29 | 显示全部楼层
哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-3 08:48:46 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 09:48:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-11-7 10:15 编辑

这个代码好麻烦,本来想写个任意数的加减乘除。一直有错误,只好写了个控制在[-65535,65535]之间的加减乘除。
这么麻烦的作业,要提前做准备。

  1. assume cs:code,ds:data

  2. data segment
  3.         Numeric  STRUC
  4.                 Integer        DW  0,0,0
  5.                 Signed        DW        0
  6.         Numeric        ENDS

  7.         num_1        Numeric <>
  8.         num_2        Numeric <>
  9.         num_3        Numeric <>

  10.         buffer        DB        8 dup(0)
  11.     msg1 db 'Input a number[-65535,65535]:',36
  12.         msg2 db 'Please input a rightful number!',0ah,0dh,36
  13.         msg3 db 'The number is too big!',0ah,0dh,36
  14.         msg4 db 'divider can not be zero!',0ah,0dh,36
  15. data ends

  16. code segment
  17. _Break                MACRO
  18.         NOP
  19.         INT                1H
  20.         NOP
  21.                         ENDM

  22. _EnterLine        MACRO
  23.         MOV                AH,02
  24.         MOV                DL,0AH
  25.         INT                21H
  26.         MOV                DL,0DH
  27.         INT                21H
  28.                         ENDM

  29. _PushAll        MACRO
  30.         PUSH        SI
  31.         PUSH        DI
  32.         PUSH        BX
  33.         PUSH        CX
  34.         PUSH        DX
  35.                         ENDM

  36. _PopAll                MACRO
  37.         POP                DX
  38.         POP                CX
  39.         POP                BX
  40.         POP                DI
  41.         POP                SI
  42.                         ENDM
  43. _start:
  44.         MOV                AX,DATA
  45.         MOV                DS,AX
  46.         MOV                ES,AX
  47.        
  48.         PUSH        OFFSET num_1
  49.         CALL        _GetNumeric

  50.         PUSH        OFFSET num_2
  51.         CALL        _GetNumeric

  52.         CALL        _CopyNumeric
  53.         PUSH        OFFSET num_2
  54.         PUSH        OFFSET num_3
  55.         CALL        _AddNumeric

  56.         CALL        _CopyNumeric
  57.         PUSH        OFFSET num_2
  58.         PUSH        OFFSET num_3
  59.         CALL        _SubNumeric

  60.         CALL        _CopyNumeric
  61.         PUSH        OFFSET num_2
  62.         PUSH        OFFSET num_3
  63.         CALL        _MulNumeric
  64.        
  65.         CALL        _CopyNumeric
  66.         PUSH        OFFSET num_2
  67.         PUSH        OFFSET num_3
  68.         CALL        _DivNumeric
  69.        
  70.         MOV                AX,4C00H
  71.         INT                21H

  72. _AddNumeric        PROC
  73.         PUSH        BP
  74.         MOV                BP,SP
  75.         _PushAll

  76.         PUSH        [BP+4]
  77.         PUSH        0
  78.         CALL        _OutputNumeric
  79.         MOV                AH,2
  80.         MOV                DL,'+'
  81.         INT                21H
  82.         PUSH        [BP+6]
  83.         PUSH        0
  84.         CALL        _OutputNumeric
  85.         MOV                AH,2
  86.         MOV                DL,'='
  87.         INT                21H
  88.        
  89.         MOV                SI,[BP+4]
  90.         MOV                DI,[BP+6]

  91.         PUSH        [DI]
  92.         PUSH        [SI]

  93.         MOV                AX,[SI].Signed
  94.         SUB                AX,[DI].Signed
  95.        
  96.         TEST        AX,AX
  97.         JE                _AnSameSigned
  98.         CALL        _SimpleSub
  99.         MOV                [SI],AX
  100.         MOV                AX,[SI].Signed
  101.         XOR                AX,DX
  102.         MOV                [SI].Signed,AX
  103.         JMP                _AnEnd
  104. _AnSameSigned:
  105.         CALL        _SimpleAdd
  106.         MOV                [SI],AX
  107.         MOV                [SI+2],DX
  108. _AnEnd:
  109.         PUSH        [BP+4]
  110.         PUSH        0
  111.         CALL        _OutputNumeric
  112.         _EnterLine

  113.         _PopAll
  114.         MOV                SP,BP
  115.         POP                BP
  116.         RET                4
  117. _AddNumeric        ENDP

  118. _SubNumeric        PROC
  119.         PUSH        BP
  120.         MOV                BP,SP
  121.         _PushAll

  122.         PUSH        [BP+4]
  123.         PUSH        0
  124.         CALL        _OutputNumeric
  125.         MOV                AH,2
  126.         MOV                DL,'-'
  127.         INT                21H
  128.         PUSH        [BP+6]
  129.         PUSH        0
  130.         CALL        _OutputNumeric
  131.         MOV                AH,2
  132.         MOV                DL,'='
  133.         INT                21H
  134.        
  135.         MOV                SI,[BP+4]
  136.         MOV                DI,[BP+6]

  137.         PUSH        [DI]
  138.         PUSH        [SI]

  139.         MOV                AX,[SI].Signed
  140.         SUB                AX,[DI].Signed
  141.        
  142.         TEST        AX,AX
  143.         JNE                _SnSameSigned
  144.         CALL        _SimpleSub
  145.         MOV                [SI],AX
  146.         MOV                AX,[SI].Signed
  147.         XOR                AX,DX
  148.         MOV                [SI].Signed,AX
  149.         JMP                _SnEnd
  150. _SnSameSigned:
  151.         CALL        _SimpleAdd
  152.         MOV                [SI],AX
  153.         MOV                [SI+2],DX
  154. _SnEnd:
  155.         PUSH        [BP+4]
  156.         PUSH        0
  157.         CALL        _OutputNumeric
  158.         _EnterLine

  159.         _PopAll
  160.         MOV                SP,BP
  161.         POP                BP
  162.         RET                4
  163. _SubNumeric        ENDP

  164. _MulNumeric        PROC
  165.         PUSH        BP
  166.         MOV                BP,SP
  167.         SUB                SP,20
  168.         PUSH        DS
  169.         PUSH        ES
  170.         _PushAll

  171.         PUSH        [BP+4]
  172.         PUSH        0
  173.         CALL        _OutputNumeric
  174.         MOV                AH,2
  175.         MOV                DL,'*'
  176.         INT                21H
  177.         PUSH        [BP+6]
  178.         PUSH        0
  179.         CALL        _OutputNumeric
  180.         MOV                AH,2
  181.         MOV                DL,'='
  182.         INT                21H

  183.         MOV                WORD PTR [BP-2],0
  184.         MOV                WORD PTR [BP-4],10000
  185.         MOV                SI,[BP+4]
  186.         MOV                DI,[BP+6]

  187.         MOV                AX,[SI].Signed
  188.         XOR                AX,[DI].Signed
  189.         MOV                [SI].Signed,AX

  190.         MOV                AX,[SI]
  191.         MOV                DX,[SI+2]
  192.         MOV                BX,10000
  193.         DIV                BX
  194.         MOV                [SI],DX
  195.         MOV                [SI+2],AX

  196.         MOV                AX,[DI]
  197.         MOV                DX,[DI+2]
  198.         DIV                BX
  199.         MOV                [BP-20],DX
  200.         MOV                [BP-18],AX
  201.        
  202.         MOV                AX,[SI]
  203.         MUL                WORD PTR [BP-20]
  204.         DIV                WORD PTR [BP-4]
  205.         MOV                [BP-16],DX
  206.         MOV                [BP-2],AX
  207.         MOV                AX,[SI+2]
  208.         MUL                WORD PTR [BP-20]
  209.         ADD                AX,[BP-2]
  210.         ADC                DX,0
  211.         DIV                WORD PTR [BP-4]
  212.         MOV                [BP-14],DX
  213.         MOV                [BP-12],AX
  214.        
  215.         MOV                AX,[SI]
  216.         MUL                WORD PTR [BP-18]
  217.         DIV                WORD PTR [BP-4]
  218.         MOV                [BP-10],DX
  219.         MOV                [BP-2],AX
  220.         MOV                AX,[SI+2]
  221.         MUL                WORD PTR [BP-18]
  222.         ADD                AX,[BP-2]
  223.         ADC                DX,0
  224.         DIV                WORD PTR [BP-4]
  225.         MOV                [BP-8],DX
  226.         MOV                [BP-6],AX
  227.                
  228.         MOV                AX,[BP-16]
  229.         MOV                [SI],AX
  230.         XOR                DX,DX
  231.         XOR                BX,BX
  232.         MOV                AX,[BP-14]
  233.         ADD                AX,[BP-10]
  234.         ADC                BX,0
  235.         DIV                WORD PTR [BP-4]
  236.         MOV                [SI+2],DX
  237.         ADD                BX,AX
  238.         MOV                AX,[BP-12]
  239.         ADD                AX,BX
  240.         ADD                AX,[BP-8]
  241.         MOV                [SI+4],AX

  242.         PUSH        SI
  243.         PUSH        1
  244.         CALL        _OutputNumeric
  245.        
  246.         _EnterLine
  247.         _PopAll
  248.         POP                ES
  249.         POP                DS
  250.         ADD                SP,20
  251.         MOV                SP,BP
  252.         POP                BP
  253.         RET                4
  254. _MulNumeric        ENDP

  255. _DivNumeric        PROC
  256.         PUSH        BP
  257.         MOV                BP,SP
  258.         _PushAll

  259.         PUSH        [BP+4]
  260.         PUSH        0
  261.         CALL        _OutputNumeric
  262.         MOV                AH,2
  263.         MOV                DL,'/'
  264.         INT                21H
  265.         PUSH        [BP+6]
  266.         PUSH        0
  267.         CALL        _OutputNumeric
  268.         MOV                AH,2
  269.         MOV                DL,'='
  270.         INT                21H

  271.         MOV                SI,[BP+4]
  272.         MOV                DI,[BP+6]
  273.        
  274.         MOV                BX,[DI]
  275.         TEST        BX,BX
  276.         JNE                _DividerIsNotZero
  277.         MOV                AH,9
  278.         LEA                DX,msg4
  279.         INT                21H
  280.         JMP                _DivEnd
  281. _DividerIsNotZero:
  282.         MOV                AX,[SI].Signed
  283.         XOR                AX,[DI].Signed
  284.         MOV                [SI].Signed,AX
  285.         MOV                AX,[SI]
  286.         XOR                DX,DX
  287.         DIV                BX
  288.         MOV                [SI],AX
  289.         PUSH        [BP+4]
  290.         PUSH        0
  291.         CALL        _OutputNumeric
  292. _DivEnd:
  293.         _EnterLine

  294.         _PopAll
  295.         MOV                SP,BP
  296.         POP                BP
  297.         RET                4
  298. _DivNumeric        ENDP

  299. _SimpleAdd        PROC
  300.         PUSH        BP
  301.         MOV                BP,SP
  302.         XOR                DX,DX
  303.         MOV                AX,[BP+4]
  304.         ADD                AX,[BP+6]
  305.         ADC                DX,0
  306.         MOV                SP,BP
  307.         POP                BP
  308.         RET                4
  309. _SimpleAdd        ENDP

  310. _SimpleSub        PROC
  311.         PUSH        BP
  312.         MOV                BP,SP
  313.         SUB                SP,2

  314.         MOV                WORD PTR [BP-2],0
  315.         MOV                AX,[BP+4]
  316.         MOV                DX,[BP+6]
  317.         CMP                AX,DX
  318.         JAE                _@15
  319.         XCHG        AX,DX
  320.         INC                WORD PTR [BP-2]
  321. _@15:
  322.         SUB                AX,DX
  323.         MOV                DX,WORD PTR [BP-2]
  324.         ADD                SP,2
  325.         MOV                SP,BP
  326.         POP                BP
  327.         RET                4
  328. _SimpleSub        ENDP

  329. _GetNumeric                PROC
  330.         PUSH        BP
  331.         MOV                BP,SP
  332.         SUB                SP,6
  333.         _PushAll

  334.         JMP                _GNBegin
  335. _Number2Big:
  336.         MOV                AH,09H
  337.         LEA                DX,msg3
  338.         INT                21H
  339. _GNBegin:
  340.         CALL        _InputNumber
  341.         MOV                [BP-2],AX
  342.         MOV                WORD PTR [BP-4],0
  343.         MOV                WORD PTR [BP-6],10
  344.         LEA                SI,buffer
  345. _GNLoop:
  346.         XOR                AX,AX
  347.         LODSB
  348.         TEST        AL,AL
  349.         JE                _GNEnd
  350.         SUB                AL,030H
  351.         MOV                BX,AX
  352.         MOV                AX,[BP-4]
  353.         MUL                WORD PTR [BP-6]
  354.         JC                _Number2Big
  355.         ADD                AX,BX
  356.         JC                _Number2Big
  357.         MOV                [BP-4],AX
  358.         JMP                _GNLoop
  359. _GNEnd:
  360.         MOV                SI,[BP+4]
  361.         PUSH        [BP-4]
  362.         POP                [SI].Integer
  363.         PUSH        [BP-2]
  364.         POP                [SI].Signed
  365.        
  366.         _PopAll
  367.         ADD                SP,6
  368.         MOV                SP,BP
  369.         POP                BP
  370.         RET                2
  371. _GetNumeric                ENDP

  372. _InputNumber        PROC
  373.         JMP                _@10
  374. _@9:
  375.         MOV                AH,09
  376.         LEA                DX,msg2
  377.         INT                21H
  378. _@10:
  379.         MOV                AH,09
  380.         LEA                DX,msg1
  381.         INT                21H

  382.         XOR                AX,AX
  383.         MOV                CX,4
  384.         LEA                DI,buffer
  385.         PUSH        DI
  386.         REP                STOSW
  387.         POP                DI

  388.         XOR                CX,CX
  389.         XOR                BX,BX
  390.         MOV                AH,01
  391.         INT                21H
  392.         CMP                AL,'-'
  393.         JNE                _@11
  394.         INC                BX
  395.         JMP                _@12
  396. _@11:
  397.         CMP                AL,'+'
  398.         JNE                _@13
  399. _@12:
  400.         MOV                AH,01H
  401.         INT                21H
  402. _@13:
  403.         CMP                AL,0DH
  404.         JE                _@14
  405.         CMP                AL,'0'
  406.         JL                _@9
  407.         CMP                AL,'9'
  408.         JG                _@9
  409.         STOSB
  410.         INC                CX
  411.         CMP                CX,5
  412.         JGE                _@14
  413.         JMP                _@12
  414. _@14:
  415.         _EnterLine
  416.         MOV                AX,BX
  417.         RET
  418. _InputNumber        ENDP

  419. _OutputNumber        PROC
  420.         PUSH        BP
  421.         MOV                BP,SP
  422.         SUB                SP,4
  423.         _PushAll

  424.         MOV                WORD PTR [BP-2],0
  425.         MOV                WORD PTR [BP-4],1000
  426.         MOV                CX,4
  427.         MOV                AX,[BP+6]
  428. _@1:       
  429.         XOR                DX,DX
  430.         DIV                WORD PTR [BP-4]
  431.         XCHG        AX,DX
  432.         TEST        DX,DX
  433.         JNE                _@2
  434.         MOV                BX,[BP+4]
  435.         ADD                BX,[BP-2]
  436.         TEST        BX,BX
  437.         JE                _@3
  438. _@2:
  439.         PUSH        AX
  440.         MOV                AH,02
  441.         ADD                DL,030H
  442.         INT                21H
  443.         POP                AX
  444.         INC                WORD PTR [BP-2]
  445. _@3:
  446.         PUSH        AX
  447.         XOR                DX,DX
  448.         MOV                AX,[BP-4]
  449.         MOV                BX,10
  450.         DIV                BX
  451.         MOV                [BP-4],AX
  452.         POP                AX
  453.         LOOP        _@1
  454.        
  455.         MOV                AX,WORD PTR [BP-2]
  456.         _PopAll
  457.         ADD                SP,4
  458.         MOV                SP,BP
  459.         POP                BP
  460.         RET                4
  461. _OutputNumber        ENDP

  462. _CopyNumeric        PROC
  463.         LEA                SI,num_1
  464.         LEA                DI,num_3
  465.         MOV                CX,size Numeric
  466.         REP                MOVSB
  467.         RET
  468. _CopyNumeric        ENDP

  469. _OutputNumeric        PROC
  470.         PUSH        BP
  471.         MOV                BP,SP
  472.         SUB                SP,2
  473.         _PushAll

  474.         MOV                WORD PTR [BP-2],0

  475.         MOV                SI,[BP+6]
  476.         MOV                AX,[SI].Signed
  477.         TEST        AX,AX
  478.         JE                _@4
  479.         MOV                AH,2
  480.         MOV                DL,'('
  481.         INT                21H
  482.         MOV                AH,2
  483.         MOV                DL,'-'
  484.         INT                21H
  485. _@4:
  486.         MOV                AX,[BP+4]
  487.         TEST        AX,AX
  488.         JNE                _@5
  489.         MOV                AX,[SI]
  490.         MOV                DX,[SI+2]
  491.         MOV                BX,10000
  492.         DIV                BX
  493.         PUSH        AX
  494.         PUSH        [BP-2]
  495.         CALL        _OutputNumber
  496.         MOV                [BP-2],AX
  497.         PUSH        DX
  498.         PUSH        AX
  499.         CALL        _OutputNumber
  500.         ADD                [BP-2],AX
  501.         JMP                _@7
  502. _@5:
  503.         MOV                CX,3
  504.         ADD                SI,4
  505. _@6:
  506.         MOV                AX,[SI]
  507.         PUSH        AX
  508.         PUSH        [BP-2]
  509.         CALL        _OutputNumber
  510.         ADD                [BP-2],AX
  511.         SUB                SI,2
  512.         LOOP        _@6
  513. _@7:
  514.         MOV                AX,[BP-2]
  515.         TEST        AX,AX
  516.         JNE                _@8
  517.         MOV                AH,2
  518.         MOV                DL,030H
  519.         INT                21H
  520. _@8:
  521.         MOV                SI,[BP+6]
  522.         MOV                AX,[SI].Signed
  523.         TEST        AX,AX
  524.         JE                _OnEnd
  525.         MOV                AH,2
  526.         MOV                DL,')'
  527.         INT                21H
  528. _OnEnd:
  529.         _PopAll
  530.         ADD                SP,2
  531.         MOV                SP,BP
  532.         POP                BP
  533.         RET                4
  534. _OutputNumeric        ENDP
  535. code ends
  536. END _start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 09:51:43 | 显示全部楼层
运行结果如图
无标题.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-7 17:34:55 | 显示全部楼层

谢谢,看别人写的代码也是一种学习,500多行,真的幸苦你了,再次表示感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 18:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表