Другие языки программирования и технологии

Как перевести число из троичной системы счисления в десятичную в Ассемблер (tasm)

Отличия от предыдущей программы выделены жирным шрифтом, часть из которых просто изменение меток.

ideal
model small, stdcall
p386

codeseg
    startupcode
RepeatInput:
    mov ah,9
    mov dx,offset Prompt
    int 21h
    mov [Buff],20
    inc ah
    mov dx,offset Buff
    int 21h
    movzx ax,[byte Buff+1]
    call TernaryToBin,offset Buff+2,ax
    jnc Print
    mov dx,offset Error
    mov ah,9
    int 21h
    jmp RepeatInput
Print:
    mov [Number],eax
    mov dx,offset Result
    mov ah,9
    int 21h
    call WriteDec,[dword Number]

    mov dx,offset Quit
    mov ah,9
    int 21h
    dec ah
    int 21h
    exitcode

proc TernaryToBin uses ebx cx edx si edi, Addr :word, Len: word
    xor ebx,ebx
    mov edi,ebx
    mov si,Addr
    mov cx,Len
    jcxz TErr
    lodsb
    cmp al,'-'
    jne TerToBin1
    not edi
    jmp TerToBin2
TerToBin1:
    cmp al,'+'
    jne TerToBin4
TerToBin2:
    dec cx
    jcxz TErr
TerToBin3:
    lodsb
TerToBin4:
    sub al,'0'
    jb TErr
    cmp al,2
    ja TErr
    movzx eax,al
    xchg eax,ebx
    mov edx,3
    mul edx
    add ebx,eax
    loop TerToBin3
    mov eax,ebx
    xor eax,edi
    sub eax,edi
    or eax,eax
    jmp TerToBin5
TErr:
    stc
TerToBin5:
    ret
    endp

proc WriteDec uses eax ebx cx edx, X :dword
    mov eax,X
    cdq
    xor eax,edx
    sub eax,edx
    and dl,'-'
    jz WrDec1
    push eax
    mov al,dl
    int 29h
    pop eax
WrDec1:
    mov ebx,10
    xor cx,cx
WrDec2:
    cdq
    div ebx
    or dl,'0'
    push dx
    inc cx
    test eax,eax
    jnz WrDec2
WrDec3:
    pop ax
    int 29h
    loop WrDec3
    ret
    endp

dataseg
Prompt db 'Введите число в троичной системе: $'
Result db 13,10,'Число в десятичной системе: $'
Error db 13,10,'Ошибка! Повторите ввод. ',13,10,36
Quit db 13,10,10,'Для завершения нажмите любую клавишу... $'

udataseg
Buff db 22 dup (?)
Number dd ?

stack 100h

    end

Диапазон представления десятичных чисел: -387420488 ...1162261466.
Veniamin Mokritskii
Veniamin Mokritskii
51 590
Лучший ответ
Умножать на три и прибавлять, как завещал великий Горнер. И так восемь раз!!!
Семён Лаптев
Семён Лаптев
75 009
на этот вопрос тебе ответит твой учитель по программированию.
Делить на три, до тех пор, пока число не кончится.
Даже на ассемблере это просто.

Похожие вопросы