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

Как перевести число из троичной системы счисления в десятичную в Ассемблер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.

  • на этот вопрос тебе ответит твой учитель по программированию.
  • Делить на три, до тех пор, пока число не кончится.
    Даже на ассемблере это просто.
  • Умножать на три и прибавлять, как завещал великий Горнер. И так восемь раз!!!