Перевод числа из десятичной системы в двоичную - Assembler
Формулировка задачи:
программа перевода числа из десятичной системы в двоичную в FASM. СКОЛЬКО НЕ ПЫТАЛИСЬ, НЕ МОЖЕМ СДЕЛАТЬ, ПРАКТИКА, НИКОГДА ТАКОЕ НЕ ПИСАЛА, ПОМОГИТЕ ПЛИЗ! ЗАВТРА СДАВАТЬ НАДО. БУДУ БЛАГОДАРНА
Решение задачи: «Перевод числа из десятичной системы в двоичную»
textual
Листинг программы
format PE console include 'win32a.inc' mov edi,spn10 mov ecx,[qcspn10] call SIOprintS mov edi,sNumber10 mov ecx,10 call SIOscanS add edi,eax mov byte [edi],'A' sub edi,eax mov esi,edi call CNSToSignedInt mov edi,sNumber2 call convertToS2 mov edi,spn2 mov ecx,[qcspn2] call SIOprintS mov edi,sNumber2 mov ecx,32 call SIOprintS mov edi,snl mov ecx,[qcsnl] call SIOprintS mov edi,sppe mov ecx,[qcsppe] call SIOprintS mov edi,sNumber10 mov ecx,0 call SIOscanS invoke ExitProcess,0 proc convertToS2 push eax mov al,'0' mov ecx,32 rep stosb dec edi pop eax .mConvert: cmp eax,0 je .mEx shr eax,1 jnc .mRZero mov byte [edi],'1' .mRZero: dec edi jmp .mConvert .mEx: ret endp proc SIOscanS ;Input string ;Input parameters: ;EDI - string ;ECX - maximal number of characters to input ;Output parameters: ;EAX - number of characters local qcio dd ? invoke GetStdHandle,STD_INPUT_HANDLE lea ebx,[qcio] invoke ReadConsole,eax,edi,ecx,ebx,0 mov eax,[qcio] sub eax,2 ret endp proc CNSToSignedInt ;Convert string to signed integer number ;Use all characters until non-digit ;Number must fit into one register ;Input parameters: ; ESI - string address ;Output parameters: ; EAX - number ; ECX - length of string mov ebx,0 cmp byte [esi],'-' jne .mNotNeg inc esi inc ebx .mNotNeg: mov ecx,0 .mABFL: cmp byte [esi],'0' jl .mAEndFL cmp byte [esi],'9' jg .mAEndFL inc ecx inc esi jmp .mABFL .mAEndFL: cmp ecx,0 jg .mVN cmp ebx,0 je .mVN dec ebx dec esi .mVN: push ebx push ecx mov ebx,0 mov edx,1 .mConvert: dec ecx cmp ecx,0 jl .mExConvert dec esi mov eax,0 mov al,byte [esi] sub al,'0' push edx mul edx pop edx add ebx,eax mov eax,10 mul edx mov edx,eax jmp .mConvert .mExConvert: mov eax,ebx pop ecx pop ebx cmp ebx,1 jne .mANotNegF neg eax inc ecx dec esi .mANotNegF: ret endp proc SIOprintS ;Output string ;Input parameters: ;EDI - string ;ECX - string length local qcio dd ? invoke GetStdHandle,STD_OUTPUT_HANDLE lea ebx,[qcio] invoke WriteConsole,eax,edi,ecx,ebx,0 ret endp spn10 db 'Decimal: ' qcspn10 dd $-spn10 spn2 db 'Binary: ' qcspn2 dd $-spn2 sNumber10 db 11 dup('A') sNumber2 db 32 dup('A') nx dd 0 snl db 13,10 qcsnl dd $-snl sppe db 'Press Enter: ' qcsppe dd $-sppe include 'API\kernel32.inc' data import library kernel32,'KERNEL32.DLL' end data