Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- section .data
- result: times 0FFh DB 0
- input: times 0FFh DB 0
- derr: DB 'Division by zero'
- section .text
- global _start
- _getchar: push edx
- push ecx
- push ebx
- push eax
- mov eax,3
- mov ebx,0
- mov ecx,result
- mov edx,1
- int 80h
- pop eax
- mov al,[ecx]
- pop ebx
- pop ecx
- pop edx
- cmp al,0Ah
- je _new
- cmp al,1Bh
- je _exit
- ret
- _new: pop eax
- call _enter
- jmp _firstf
- _exit: call _enter
- mov eax,54
- mov ebx,0
- mov ecx,5401h
- mov edx,input
- int 80h
- add edx,12
- or byte [edx],0Ah
- mov eax,54
- mov ebx,0
- mov ecx,5402h
- mov edx,input
- int 80h
- mov eax,1
- xor ebx,ebx
- int 80h
- _printchar: push edx
- push ecx
- push ebx
- push eax
- mov eax,4
- mov ebx,1
- mov ecx,result
- mov edx,1
- int 80h
- pop eax
- pop ebx
- pop ecx
- pop edx
- ret
- _add: mov ecx,0FFh
- mov ebx,result
- add ebx,ecx
- movzx edx,ah
- add esi,edx
- movzx edx,al
- add edi,edx
- xor edx,edx
- _ladd: dec ebx
- dec esi
- dec edi
- cmp ah,0
- jz _noadd1
- add dl,[esi]
- dec ah
- _noadd1: cmp al,0
- jz _noadd2
- add dl,[edi]
- dec al
- _noadd2: cmp dl,0Ah
- jl _addOK
- sub dl,0Ah
- inc dh
- _addOK: mov [ebx],dl
- mov dl,dh
- xor dh,dh
- loop _ladd
- call _write
- call _enter
- jmp _firstf
- _sub: mov ecx,0FEh
- push edi
- push esi
- xor dx,dx
- _scm: cmp cl,ah
- ja _scm1
- mov dh,[esi]
- inc esi
- _scm1: cmp cl,al
- ja _scm2
- mov dl,[edi]
- inc edi
- _scm2: cmp dh,dl
- jl _subm
- jg _subp
- loop _scm
- jmp _subp
- _subm: push ax
- mov eax,4
- mov ebx,result
- mov cl,'-'
- mov [ebx],cl
- mov ebx,1
- mov ecx,result
- mov edx,1
- int 80h
- mov ebx,result
- xor cl,cl
- mov [ebx],cl
- pop ax
- xchg ah,al
- pop edi
- pop esi
- jmp _sb
- _subp: pop esi
- pop edi
- _sb: movzx ecx,ah
- mov ebx,result
- add ebx,0FEh
- add esi,ecx
- _sbcp: dec esi
- mov dl,[esi]
- mov [ebx],dl
- dec ebx
- loop _sbcp
- movzx ecx,al
- add edi,ecx
- mov ebx,result
- add ebx,0FEh
- _sbloop: mov dh,[ebx]
- dec edi
- mov dl,[edi]
- cmp dh,dl
- jge _sbOK
- add dh,0Ah
- mov esi,ebx
- _sbdec: dec esi
- mov al,[esi]
- cmp al,0
- jne _sbne
- mov al,0Ah
- _sbne: dec al
- mov [esi],al
- cmp al,9
- je _sbdec
- _sbOK: sub dh,dl
- mov [ebx],dh
- dec ebx
- loop _sbloop
- call _write
- call _enter
- jmp _firstf
- _mul: xor dx,dx
- mov cx,ax
- _loopMul: movzx ebx,dh
- add ebx,esi
- mov al,[ebx]
- movzx ebx,dl
- add ebx,edi
- mov bl,[ebx]
- mul bl
- mov bl,0Ah
- div bl
- push eax
- movzx eax,dl
- mov ebx,100h
- add ebx,eax
- movzx eax,dh
- add ebx,eax
- movzx eax,ch
- sub ebx,eax
- movzx eax,cl
- sub ebx,eax
- pop eax
- add ebx,result
- ror edx,10h
- mov dh,[ebx]
- add dh,ah
- cmp dh,0Ah
- jl _muOK
- sub dh,0Ah
- inc al
- _muOK: mov [ebx],dh
- _loMul: dec ebx
- mov dh,[ebx]
- add dh,al
- xor al,al
- cmp dh,0Ah
- jl _mulOK
- sub dh,0Ah
- inc al
- _mulOK: mov [ebx],dh
- cmp al,0
- jnz _loMul
- rol edx,10h
- inc dl
- cmp dl,cl
- jne _loopMul
- xor dl,dl
- inc dh
- cmp dh,ch
- jne _loopMul
- call _write
- call _enter
- jmp _firstf
- _div: movzx ecx,al
- mov ebx,edi
- _dvzl: mov dl,[ebx]
- cmp dl,0
- jne _dvnz
- inc ebx
- loop _dvzl
- mov eax,4
- mov ebx,1
- mov ecx,derr
- mov edx,10h
- int 80h
- call _enter
- jmp _firstf
- _dvnz: mov ebx,0FEh
- _dloop: push esi
- push edi
- mov ecx,0FEh
- _dvlo: xor dx,dx
- cmp cl,al
- ja _dcp1
- mov dl,[edi]
- inc edi
- _dcp1: push ax
- movzx ax,ah
- add bx,cx
- cmp bx,ax
- pushf
- sub bx,cx
- popf
- pop ax
- ja _dcp2
- mov dh,[esi]
- inc esi
- _dcp2: cmp dh,dl
- jg _dg
- jl _dl
- loop _dvlo
- _dg: mov ecx,ebx
- mov ebx,0FEh
- sub ebx,ecx
- add ebx,result
- mov dl,[ebx]
- inc dl
- mov [ebx],dl
- pop edi
- pop esi
- push esi
- push edi
- push ax
- push ecx
- movzx ebx,ah
- sub ebx,ecx
- add ebx,esi
- dec ebx
- movzx ecx,al
- add edi,ecx
- _dsbloop: mov dh,[ebx]
- dec edi
- mov dl,[edi]
- cmp dh,dl
- jge _dsbOK
- add dh,0Ah
- mov esi,ebx
- _dsbdec: dec esi
- mov al,[esi]
- cmp al,0
- jne _dsbne
- mov al,0Ah
- _dsbne: dec al
- mov [esi],al
- cmp al,9
- je _dsbdec
- _dsbOK: sub dh,dl
- mov [ebx],dh
- dec ebx
- loop _dsbloop
- pop ebx
- pop ax
- pop edi
- pop esi
- jmp _dloop
- _dl: pop edi
- pop esi
- cmp ebx,0
- je _dpr
- dec ebx
- jmp _dloop
- _dpr: push ax
- call _write
- pop ax
- mov edi,esi
- movzx ecx,ah
- mov ebx,ecx
- add esi,ecx
- _dplo: dec esi
- mov dl,[esi]
- cmp dl,0
- jne _dpy
- loop _dplo
- call _enter
- jmp _firstf
- _dpy: mov eax,4
- push ebx
- mov ebx,result
- mov cl,'('
- mov [ebx],cl
- mov ecx,ebx
- mov ebx,1
- mov edx,1
- int 80h
- pop ecx
- mov ebx,edi
- mov edx,ebx
- add edx,ecx
- dec edx
- call _lowrite
- mov eax,4
- mov ebx,result
- mov cl,')'
- mov [ebx],cl
- mov ecx,ebx
- mov ebx,1
- mov edx,1
- int 80h
- call _enter
- jmp _firstf
- _start: mov eax,54
- mov ebx,0
- mov ecx,5401h
- mov edx,input
- int 80h
- add edx,12
- and byte [edx],0xF5
- mov eax,54
- mov ebx,0
- mov ecx,5402h
- mov edx,input
- int 80h
- _firstf: call _getchar
- sub al,30h
- cmp al,0ah
- jnb _firstf
- mov esi,input
- mov [esi],al
- call _printchar
- inc esi
- mov ecx,0fdh
- _firsto: call _getchar
- cmp al,'+'
- je _operator
- cmp al,'-'
- je _operator
- cmp al,'*'
- je _operator
- cmp al,'/'
- je _operator
- sub al,30h
- cmp al,0ah
- jnb _firsto
- mov [esi],al
- call _printchar
- inc esi
- loop _firsto
- _operatorl: call _getchar
- cmp al,'+'
- je _operator
- cmp al,'-'
- je _operator
- cmp al,'*'
- je _operator
- cmp al,'/'
- je _operator
- jmp _operatorl
- _operator: mov dl,al
- call _printchar
- _secondf: call _getchar
- sub al,30h
- cmp al,0ah
- jnb _secondf
- mov [esi],al
- call _printchar
- mov ebx,esi
- mov edi,input
- sub ebx,edi
- mov ah,bl
- mov ecx,0feh
- mov edi,esi
- inc esi
- sub cl,bl
- jz _endinput
- _secondo: call _getchar
- cmp al,'='
- je _endinput
- sub al,30h
- cmp al,0Ah
- jnb _secondo
- mov [esi],al
- call _printchar
- inc esi
- loop _secondo
- _endinput: sub esi,edi
- mov ebx,esi
- mov al,bl
- mov esi,input
- mov ecx,result
- mov bl,'='
- mov [ecx],bl
- call _printchar
- mov ecx,0FFh
- mov ebx,result
- mov dh,0
- _clean: mov [ebx],dh
- inc ebx
- loop _clean
- cmp dl,'+'
- je _add
- cmp dl,'-'
- je _sub
- cmp dl,'*'
- je _mul
- jmp _div
- _write: mov ebx,result
- mov edx,ebx
- add edx,0FEh
- mov ecx,0FFh
- _lowrite: cmp ebx,edx
- jnb _add30
- mov al,[ebx]
- cmp al,0
- je _lwrite
- mov edx,ebx
- _add30: mov al,30h
- add [ebx],al
- _lwrite: inc ebx
- loop _lowrite
- mov ecx,edx
- mov edx,ebx
- sub edx,ecx
- mov eax,4
- mov ebx,1
- int 80h
- ret
- _enter: mov eax,4
- mov ebx,1
- mov ecx,result
- mov edx,0A01h
- mov [ecx],dh
- xor dh,dh
- int 80h
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement