Advertisement
Guest User

Calc

a guest
Oct 23rd, 2011
872
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. section .data
  2.  
  3. result: times 0FFh DB 0
  4.  
  5. input: times 0FFh DB 0
  6.  
  7. derr: DB 'Division by zero'
  8.  
  9. section .text
  10.  
  11. global _start  
  12.  
  13. _getchar:   push edx
  14.  
  15.         push ecx
  16.  
  17.         push ebx
  18.  
  19.         push eax
  20.  
  21.         mov eax,3
  22.  
  23.         mov ebx,0
  24.  
  25.         mov ecx,result
  26.  
  27.         mov edx,1
  28.  
  29.         int 80h
  30.  
  31.         pop eax
  32.  
  33.         mov al,[ecx]
  34.  
  35.         pop ebx
  36.  
  37.         pop ecx
  38.  
  39.         pop edx
  40.  
  41.         cmp al,0Ah
  42.  
  43.         je _new
  44.  
  45.         cmp al,1Bh
  46.  
  47.         je _exit
  48.  
  49.         ret
  50.  
  51. _new:       pop eax
  52.  
  53.         call _enter
  54.  
  55.         jmp _firstf
  56.  
  57. _exit:      call _enter
  58.  
  59.         mov eax,54
  60.  
  61.         mov ebx,0
  62.  
  63.         mov ecx,5401h
  64.  
  65.         mov edx,input
  66.  
  67.         int 80h
  68.  
  69.         add edx,12
  70.  
  71.         or byte [edx],0Ah
  72.  
  73.         mov eax,54
  74.  
  75.         mov ebx,0
  76.  
  77.         mov ecx,5402h
  78.  
  79.         mov edx,input
  80.  
  81.         int 80h
  82.  
  83.         mov eax,1
  84.  
  85.         xor ebx,ebx
  86.  
  87.         int 80h
  88.  
  89. _printchar: push edx
  90.  
  91.         push ecx
  92.  
  93.         push ebx
  94.  
  95.         push eax
  96.  
  97.         mov eax,4
  98.  
  99.         mov ebx,1
  100.  
  101.         mov ecx,result
  102.  
  103.         mov edx,1
  104.  
  105.         int 80h
  106.  
  107.         pop eax
  108.  
  109.         pop ebx
  110.  
  111.         pop ecx
  112.  
  113.         pop edx
  114.  
  115.         ret
  116.  
  117. _add:       mov ecx,0FFh
  118.  
  119.         mov ebx,result
  120.  
  121.         add ebx,ecx
  122.  
  123.         movzx edx,ah
  124.  
  125.         add esi,edx
  126.  
  127.         movzx edx,al
  128.  
  129.         add edi,edx
  130.  
  131.         xor edx,edx
  132.  
  133. _ladd:      dec ebx
  134.  
  135.         dec esi
  136.  
  137.         dec edi
  138.  
  139.         cmp ah,0
  140.  
  141.         jz _noadd1
  142.  
  143.         add dl,[esi]
  144.  
  145.         dec ah
  146.  
  147. _noadd1:    cmp al,0
  148.  
  149.         jz _noadd2
  150.  
  151.         add dl,[edi]
  152.  
  153.         dec al
  154.  
  155. _noadd2:    cmp dl,0Ah
  156.  
  157.         jl _addOK
  158.  
  159.         sub dl,0Ah
  160.  
  161.         inc dh
  162.  
  163. _addOK:     mov [ebx],dl
  164.  
  165.         mov dl,dh
  166.  
  167.         xor dh,dh
  168.  
  169.         loop _ladd
  170.  
  171.         call _write
  172.  
  173.         call _enter
  174.  
  175.         jmp _firstf
  176.  
  177. _sub:       mov ecx,0FEh
  178.  
  179.         push edi
  180.  
  181.         push esi
  182.  
  183.         xor dx,dx
  184.  
  185. _scm:       cmp cl,ah
  186.  
  187.         ja _scm1
  188.  
  189.         mov dh,[esi]
  190.  
  191.         inc esi
  192.  
  193. _scm1:      cmp cl,al
  194.  
  195.         ja _scm2
  196.  
  197.         mov dl,[edi]
  198.  
  199.         inc edi
  200.  
  201. _scm2:      cmp dh,dl
  202.  
  203.         jl _subm
  204.  
  205.         jg _subp
  206.  
  207.         loop _scm
  208.  
  209.         jmp _subp
  210.  
  211. _subm:      push ax
  212.  
  213.         mov eax,4
  214.  
  215.         mov ebx,result
  216.  
  217.         mov cl,'-'
  218.  
  219.         mov [ebx],cl
  220.  
  221.         mov ebx,1
  222.  
  223.         mov ecx,result
  224.  
  225.         mov edx,1
  226.  
  227.         int 80h
  228.  
  229.         mov ebx,result
  230.  
  231.         xor cl,cl
  232.  
  233.         mov [ebx],cl
  234.  
  235.         pop ax
  236.  
  237.         xchg ah,al
  238.  
  239.         pop edi
  240.  
  241.         pop esi
  242.  
  243.         jmp _sb
  244.  
  245. _subp:      pop esi
  246.  
  247.         pop edi
  248.  
  249. _sb:        movzx ecx,ah
  250.  
  251.         mov ebx,result
  252.  
  253.         add ebx,0FEh
  254.  
  255.         add esi,ecx
  256.  
  257. _sbcp:      dec esi
  258.  
  259.         mov dl,[esi]
  260.  
  261.         mov [ebx],dl
  262.  
  263.         dec ebx
  264.  
  265.         loop _sbcp
  266.  
  267.         movzx ecx,al
  268.  
  269.         add edi,ecx
  270.  
  271.         mov ebx,result
  272.  
  273.         add ebx,0FEh
  274.  
  275. _sbloop:    mov dh,[ebx]
  276.  
  277.         dec edi
  278.  
  279.         mov dl,[edi]
  280.  
  281.         cmp dh,dl
  282.  
  283.         jge _sbOK
  284.  
  285.         add dh,0Ah
  286.  
  287.         mov esi,ebx
  288.  
  289. _sbdec:     dec esi
  290.  
  291.         mov al,[esi]
  292.  
  293.         cmp al,0
  294.  
  295.         jne _sbne
  296.  
  297.         mov al,0Ah
  298.  
  299. _sbne:      dec al
  300.  
  301.         mov [esi],al
  302.  
  303.         cmp al,9
  304.  
  305.         je _sbdec
  306.  
  307. _sbOK:      sub dh,dl
  308.  
  309.         mov [ebx],dh
  310.  
  311.         dec ebx
  312.  
  313.         loop _sbloop
  314.  
  315.         call _write
  316.  
  317.         call _enter
  318.  
  319.         jmp _firstf
  320.  
  321. _mul:       xor dx,dx
  322.  
  323.         mov cx,ax
  324.  
  325. _loopMul:   movzx ebx,dh
  326.  
  327.         add ebx,esi
  328.  
  329.         mov al,[ebx]
  330.  
  331.         movzx ebx,dl
  332.  
  333.         add ebx,edi
  334.  
  335.         mov bl,[ebx]
  336.  
  337.         mul bl
  338.  
  339.         mov bl,0Ah
  340.  
  341.         div bl
  342.  
  343.         push eax
  344.  
  345.         movzx eax,dl
  346.  
  347.         mov ebx,100h
  348.  
  349.         add ebx,eax
  350.  
  351.         movzx eax,dh
  352.  
  353.         add ebx,eax
  354.  
  355.         movzx eax,ch
  356.  
  357.         sub ebx,eax
  358.  
  359.         movzx eax,cl
  360.  
  361.         sub ebx,eax
  362.  
  363.         pop eax
  364.  
  365.         add ebx,result
  366.  
  367.         ror edx,10h
  368.  
  369.         mov dh,[ebx]
  370.  
  371.         add dh,ah
  372.  
  373.         cmp dh,0Ah
  374.  
  375.         jl _muOK
  376.  
  377.         sub dh,0Ah
  378.  
  379.         inc al
  380.  
  381. _muOK:      mov [ebx],dh
  382.  
  383. _loMul:     dec ebx
  384.  
  385.         mov dh,[ebx]
  386.  
  387.         add dh,al
  388.  
  389.         xor al,al
  390.  
  391.         cmp dh,0Ah
  392.  
  393.         jl _mulOK
  394.  
  395.         sub dh,0Ah
  396.  
  397.         inc al
  398.  
  399. _mulOK:     mov [ebx],dh
  400.  
  401.         cmp al,0
  402.  
  403.         jnz _loMul
  404.  
  405.         rol edx,10h
  406.  
  407.         inc dl
  408.  
  409.         cmp dl,cl
  410.  
  411.         jne _loopMul
  412.  
  413.         xor dl,dl
  414.  
  415.         inc dh
  416.  
  417.         cmp dh,ch
  418.  
  419.         jne _loopMul
  420.  
  421.         call _write
  422.  
  423.         call _enter
  424.  
  425.         jmp _firstf
  426.  
  427. _div:       movzx ecx,al
  428.  
  429.         mov ebx,edi
  430.  
  431. _dvzl:      mov dl,[ebx]
  432.  
  433.         cmp dl,0
  434.  
  435.         jne _dvnz
  436.  
  437.         inc ebx
  438.  
  439.         loop _dvzl
  440.  
  441.         mov eax,4
  442.  
  443.         mov ebx,1
  444.  
  445.         mov ecx,derr
  446.  
  447.         mov edx,10h
  448.  
  449.         int 80h
  450.  
  451.         call _enter
  452.  
  453.         jmp _firstf
  454.  
  455. _dvnz:      mov ebx,0FEh
  456.  
  457. _dloop:     push esi
  458.  
  459.         push edi
  460.  
  461.         mov ecx,0FEh
  462.  
  463. _dvlo:      xor dx,dx
  464.  
  465.         cmp cl,al
  466.  
  467.         ja _dcp1
  468.  
  469.         mov dl,[edi]
  470.  
  471.         inc edi
  472.  
  473. _dcp1:      push ax
  474.  
  475.         movzx ax,ah
  476.  
  477.         add bx,cx
  478.  
  479.         cmp bx,ax
  480.  
  481.         pushf
  482.  
  483.         sub bx,cx
  484.  
  485.         popf
  486.  
  487.         pop ax
  488.  
  489.         ja _dcp2
  490.  
  491.         mov dh,[esi]
  492.  
  493.         inc esi
  494.  
  495. _dcp2:      cmp dh,dl
  496.  
  497.         jg _dg
  498.  
  499.         jl _dl
  500.  
  501.         loop _dvlo
  502.  
  503. _dg:        mov ecx,ebx
  504.  
  505.         mov ebx,0FEh
  506.  
  507.         sub ebx,ecx
  508.  
  509.         add ebx,result
  510.  
  511.         mov dl,[ebx]
  512.  
  513.         inc dl
  514.  
  515.         mov [ebx],dl
  516.  
  517.         pop edi
  518.  
  519.         pop esi
  520.  
  521.         push esi
  522.  
  523.         push edi
  524.  
  525.         push ax
  526.  
  527.         push ecx
  528.  
  529.         movzx ebx,ah
  530.  
  531.         sub ebx,ecx
  532.  
  533.         add ebx,esi
  534.  
  535.         dec ebx
  536.  
  537.         movzx ecx,al
  538.  
  539.         add edi,ecx
  540.  
  541. _dsbloop:   mov dh,[ebx]
  542.  
  543.         dec edi
  544.  
  545.         mov dl,[edi]
  546.  
  547.         cmp dh,dl
  548.  
  549.         jge _dsbOK
  550.  
  551.         add dh,0Ah
  552.  
  553.         mov esi,ebx
  554.  
  555. _dsbdec:    dec esi
  556.  
  557.         mov al,[esi]
  558.  
  559.         cmp al,0
  560.  
  561.         jne _dsbne
  562.  
  563.         mov al,0Ah
  564.  
  565. _dsbne:     dec al
  566.  
  567.         mov [esi],al
  568.  
  569.         cmp al,9
  570.  
  571.         je _dsbdec
  572.  
  573. _dsbOK:     sub dh,dl
  574.  
  575.         mov [ebx],dh
  576.  
  577.         dec ebx
  578.  
  579.         loop _dsbloop
  580.  
  581.         pop ebx
  582.  
  583.         pop ax
  584.  
  585.         pop edi
  586.  
  587.         pop esi
  588.  
  589.         jmp _dloop
  590.  
  591. _dl:        pop edi
  592.  
  593.         pop esi
  594.  
  595.         cmp ebx,0
  596.  
  597.         je _dpr
  598.  
  599.         dec ebx
  600.  
  601.         jmp _dloop
  602.  
  603. _dpr:       push ax
  604.  
  605.         call _write
  606.  
  607.         pop ax
  608.  
  609.         mov edi,esi
  610.  
  611.         movzx ecx,ah
  612.  
  613.         mov ebx,ecx
  614.  
  615.         add esi,ecx
  616.  
  617. _dplo:      dec esi
  618.  
  619.         mov dl,[esi]
  620.  
  621.         cmp dl,0
  622.  
  623.         jne _dpy
  624.  
  625.         loop _dplo
  626.  
  627.         call _enter
  628.  
  629.         jmp _firstf
  630.  
  631. _dpy:       mov eax,4
  632.  
  633.         push ebx
  634.  
  635.         mov ebx,result
  636.  
  637.         mov cl,'('
  638.  
  639.         mov [ebx],cl
  640.  
  641.         mov ecx,ebx
  642.  
  643.         mov ebx,1
  644.  
  645.         mov edx,1
  646.  
  647.         int 80h
  648.  
  649.         pop ecx
  650.  
  651.         mov ebx,edi
  652.  
  653.         mov edx,ebx
  654.  
  655.         add edx,ecx
  656.  
  657.         dec edx
  658.  
  659.         call _lowrite
  660.  
  661.         mov eax,4
  662.  
  663.         mov ebx,result
  664.  
  665.         mov cl,')'
  666.  
  667.         mov [ebx],cl
  668.  
  669.         mov ecx,ebx
  670.  
  671.         mov ebx,1
  672.  
  673.         mov edx,1
  674.  
  675.         int 80h
  676.  
  677.         call _enter
  678.  
  679.         jmp _firstf
  680.  
  681. _start:     mov eax,54
  682.  
  683.         mov ebx,0
  684.  
  685.         mov ecx,5401h
  686.  
  687.         mov edx,input
  688.  
  689.         int 80h
  690.  
  691.         add edx,12
  692.  
  693.         and byte [edx],0xF5
  694.  
  695.         mov eax,54
  696.  
  697.         mov ebx,0
  698.  
  699.         mov ecx,5402h
  700.  
  701.         mov edx,input
  702.  
  703.         int 80h
  704.  
  705. _firstf:    call _getchar
  706.  
  707.         sub al,30h
  708.  
  709.         cmp al,0ah
  710.  
  711.         jnb _firstf
  712.  
  713.         mov esi,input
  714.  
  715.         mov [esi],al
  716.  
  717.         call _printchar
  718.  
  719.         inc esi
  720.  
  721.         mov ecx,0fdh
  722.  
  723. _firsto:    call _getchar
  724.  
  725.         cmp al,'+'
  726.  
  727.         je _operator
  728.  
  729.         cmp al,'-'
  730.  
  731.         je _operator
  732.  
  733.         cmp al,'*'
  734.  
  735.         je _operator
  736.  
  737.         cmp al,'/'
  738.  
  739.         je _operator
  740.  
  741.         sub al,30h
  742.  
  743.         cmp al,0ah
  744.  
  745.         jnb _firsto
  746.  
  747.         mov [esi],al
  748.  
  749.         call _printchar
  750.  
  751.         inc esi
  752.  
  753.         loop _firsto
  754.  
  755. _operatorl: call _getchar
  756.  
  757.         cmp al,'+'
  758.  
  759.         je _operator
  760.  
  761.         cmp al,'-'
  762.  
  763.         je _operator
  764.  
  765.         cmp al,'*'
  766.  
  767.         je _operator
  768.  
  769.         cmp al,'/'
  770.  
  771.         je _operator
  772.  
  773.         jmp _operatorl
  774.  
  775. _operator:  mov dl,al
  776.  
  777.         call _printchar
  778.  
  779. _secondf:   call _getchar
  780.  
  781.         sub al,30h
  782.  
  783.         cmp al,0ah
  784.  
  785.         jnb _secondf
  786.  
  787.         mov [esi],al
  788.  
  789.         call _printchar
  790.  
  791.         mov ebx,esi
  792.  
  793.         mov edi,input
  794.  
  795.         sub ebx,edi
  796.  
  797.         mov ah,bl
  798.  
  799.         mov ecx,0feh
  800.  
  801.         mov edi,esi
  802.  
  803.         inc esi
  804.  
  805.         sub cl,bl
  806.  
  807.         jz _endinput
  808.  
  809. _secondo:   call _getchar
  810.  
  811.         cmp al,'='
  812.  
  813.         je _endinput
  814.  
  815.         sub al,30h
  816.  
  817.         cmp al,0Ah
  818.  
  819.         jnb _secondo
  820.  
  821.         mov [esi],al
  822.  
  823.         call _printchar
  824.  
  825.         inc esi
  826.  
  827.         loop _secondo
  828.  
  829. _endinput:  sub esi,edi
  830.  
  831.         mov ebx,esi
  832.  
  833.         mov al,bl
  834.  
  835.         mov esi,input
  836.  
  837.         mov ecx,result
  838.  
  839.         mov bl,'='
  840.  
  841.         mov [ecx],bl
  842.  
  843.         call _printchar
  844.  
  845.         mov ecx,0FFh
  846.  
  847.         mov ebx,result
  848.  
  849.         mov dh,0
  850.  
  851. _clean:     mov [ebx],dh
  852.  
  853.         inc ebx
  854.  
  855.         loop _clean
  856.  
  857.         cmp dl,'+'
  858.  
  859.         je _add
  860.  
  861.         cmp dl,'-'
  862.  
  863.         je _sub
  864.  
  865.         cmp dl,'*'
  866.  
  867.         je _mul
  868.  
  869.         jmp _div
  870.  
  871. _write:     mov ebx,result
  872.  
  873.         mov edx,ebx
  874.  
  875.         add edx,0FEh
  876.  
  877.         mov ecx,0FFh
  878.  
  879. _lowrite:   cmp ebx,edx
  880.  
  881.         jnb _add30
  882.  
  883.         mov al,[ebx]
  884.  
  885.         cmp al,0
  886.  
  887.         je _lwrite
  888.  
  889.         mov edx,ebx
  890.  
  891. _add30:     mov al,30h
  892.  
  893.         add [ebx],al
  894.  
  895. _lwrite:    inc ebx
  896.  
  897.         loop _lowrite
  898.  
  899.         mov ecx,edx
  900.  
  901.         mov edx,ebx
  902.  
  903.         sub edx,ecx
  904.  
  905.         mov eax,4
  906.  
  907.         mov ebx,1
  908.  
  909.         int 80h
  910.  
  911.         ret
  912.  
  913. _enter:     mov eax,4
  914.  
  915.         mov ebx,1
  916.  
  917.         mov ecx,result
  918.  
  919.         mov edx,0A01h
  920.  
  921.         mov [ecx],dh
  922.  
  923.         xor dh,dh
  924.  
  925.         int 80h
  926.  
  927.         ret
  928.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement