%macro output 1 pushad mov eax,%1 call print popad %endmacro %macro endl 0 output new_line %endmacro %macro outputd 1 dtoa buf,%1 output buf %endmacro %macro input 2 pushad push %1 push %2 call input_ popad %endmacro %macro inputd 0-1 eax input buf,11 atod buf,%1 %endmacro %macro atod 1-2 eax push eax push ebx push ecx push edx push edi push %1 call convert_ascii add esp,4 mov [dbuf],ecx pop edi pop edx pop ecx pop ebx pop eax mov %2,[dbuf] %endmacro %macro dtoa 2 pushad push %1 push %2 call convert_double popad %endmacro section .data sign: db 0 section .bss buf: resb 11 dbuf: resd 1 section .text new_line: db 10,0 print: mov edi,-1 call get_string mov ecx,eax mov edx,edi mov eax,4 mov ebx,1 int 80h ret get_string: inc edi cmp byte [eax+edi],0 jne get_string ret input_: mov ecx,[esp+8] mov edx,[esp+4] mov eax,3 mov ebx,0 int 80h ret 8 convert_ascii: mov edx,[esp+4] mov edi,-1 mov ecx,0 mov eax,0 mov byte [sign],0 jmp determine_sign convert_continue: call determine_decimal cmp byte [sign],1 je negate ret determine_sign: cmp byte [edx],2dh jne convert_continue non_positive: mov byte [sign],1 inc edi jmp convert_continue determine_decimal: mov ebx,0 inc edi cmp byte [edx+edi],30h jl return cmp byte [edx+edi],39h jg return mov ebx,0 mov bl,[edx+edi] sub bl,30h push edx mov eax,ecx mov ecx,10 mul dword ecx mov ecx,eax add ecx,ebx pop edx jmp determine_decimal return: ret negate: neg ecx mov byte [sign],0 mov eax,ecx ret convert_double: mov ebx,[esp+8] mov eax,[esp+4] sub ecx,ecx mov esi,10 mov byte [sign],0 cmp eax,0 je input_is_zero jl _negetive jmp get_numbers _negetive: neg eax mov byte [sign],1 get_numbers: cmp eax,0 je put_numbers cdq div esi add edx,30h push edx inc ecx jmp get_numbers put_numbers: cmp byte [sign],0 je add_numbers add_negation: mov byte [ebx],'-' inc ebx add_numbers: pop edx mov byte [ebx],dl inc ebx loop add_numbers mov byte [ebx],0 ret 8 input_is_zero: mov byte [ebx],30h inc ebx mov byte [ebx],0 ret 8 section .data a: times 4 db 0 b: times 4 db 0 c: times 4 db 0 d: times 4 db 0 e: times 4 db 0 f: times 4 db 0 g: times 4 db 0 h: times 4 db 0 i: times 4 db 0 j: times 4 db 0 k: times 4 db 0 l: times 4 db 0 _start: push ebx push ecx inputd a, eax inputd b inputd inputd d inputd e inputd f inputd g inputd h inputd i inputd j inputd k inputd l