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

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

Ilia Tilkin
Ilia Tilkin
379
Помнится, у вас TASM в DOSBox.
Функция TernaryToBin преобразует символьное представление троичного числа из буферной строки Addr длиной Len во внутреннее двоичное представление. При ошибке устанавливает флаг переноса CF.
Процедура WriteOct выводит в консоль число X в восьмеричном виде.

ideal
model small
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 stdcall,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 WriteOct stdcall,[dword Number]

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

proc TernaryToBin stdcall 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 WriteOct stdcall uses eax cx edx, X :dword
    mov eax,X
    cdq
    xor eax,edx
    sub eax,edx
    and dl,'-'
    jz WrOct1
    push eax
    mov al,dl
    int 29h
    pop eax
WrOct1:
    xor cx,cx
WrOct2:
    mov dl,al
    and dl,7
    or dl,'0'
    push dx
    inc cx
    shr eax,3
    jnz WrOct2
WrOct3:
    pop ax
    int 29h
    loop WrOct3
    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



Программа работоспособна для чисел из диапазона -222222222222222222 ... 2222222222222222222 в троичной системе или от -2705710510 до 10521531732 в восьмеричной.
АА
Асхат Абдиваитов
51 590
Лучший ответ
В ассемблере кагбэ внутреннее представление чисел всегда двоичное (ну или BCD на худой конец) , поэтому уточни-ка задание.
?????? ?? ??????????
?????? ?? ??????????
89 552

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