Перевод числа из десятичной системы в двоичную - 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

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы