Функция 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 в восьмеричной.