Другие языки программирования и технологии
Информатика, ассемблер, перевод двоичной в восьмую степень
В ассемблере написать программу которая из двоичной переводит в восьмую степень
"перевести" в восьмую степень это как? Покажи на примере
Сдвигами вправо.
; ввести двоичное число и преобразовать его в 8-ричное
.model tiny
.286
.code
org 100h
Start:
;-- ввод данных ------------------------
mov dx,offset BinMsg
mov ah,9
int 21h ; вывод приветствия
mov ah,0Ah
mov dx,offset BinBuf
int 21h ; ввод данных с клавиатуры
mov ah,9
mov dx,offset CRLF
int 21h ; переходим на новую строку
mov cl,[BinBuf+1]
xor ch,ch ; cx = длина строки
jcxz @@wrongnumber ; пустая строка
mov si,offset Bin
xor dx,dx ; получаемое число
cld ; прямой порядок чтения данных
; начинаем преобразование
@@nextbin:
lodsb
cmp al,'0'
jb @@wrongnumber ; введённый символ меньше '0'
cmp al,'1'
ja @@wrongnumber ; введённый символ больше '1'
add al,255-'0' ; если это символ '0', то al=255 и CF=0; если '1', то al=0 и CF=1 (произошёл перенос через границу байта)
rcl dx,1 ; сдвигаем dx на 1 бит влево, записывая в младший бит значение флага CF, т. е. фактически введённый бит (0 или 1)
loop @@nextbin
; теперь у нас в dx число, которое нужно преобразовать в 8-ричное
xor cx,cx ; счётчик символов
@@nextoct:
mov al,dl
and al,7 ; получаем 3 младших бита
add al,'0' ; преобразуем их в цифру '0'..'7'
push ax ; сохраняем в стеке
inc cx ; увеличиваем счётчик символов
shr dx,3 ; сдвигаем dx на 3 бит вправо
jnz @@nextoct ; повторяем, если есть ещё цифры
; теперь у нас в стеке cx символов (цифр), которые нужно вывести на экран
mov ah,9
mov dx,offset OctMsg
int 21h ; вывод сообщения
@@output:
pop dx ; читаем записанные в стек цифры в обратном порядке
mov ah,2
int 21h ; выводим цифру на экран
loop @@output
@@exit:
int 20h ; выход из программы
@@wrongnumber:
mov ah,9
mov dx,offset WrongMsg
int 21h ; сообщение об ошибке ввода
jmp @@exit
.data
BinMsg db 'Bin = $'
OctMsg db 'Oct = $'
CRLF db 13,10,'$'
WrongMsg db 'Введённое число не является двоичным! $'
BinBuf db 17,? ; буфер для ввода до 16 символов
Bin db 17 dup (?) ; наше число
end Start
Удачи!
.model tiny
.286
.code
org 100h
Start:
;-- ввод данных ------------------------
mov dx,offset BinMsg
mov ah,9
int 21h ; вывод приветствия
mov ah,0Ah
mov dx,offset BinBuf
int 21h ; ввод данных с клавиатуры
mov ah,9
mov dx,offset CRLF
int 21h ; переходим на новую строку
mov cl,[BinBuf+1]
xor ch,ch ; cx = длина строки
jcxz @@wrongnumber ; пустая строка
mov si,offset Bin
xor dx,dx ; получаемое число
cld ; прямой порядок чтения данных
; начинаем преобразование
@@nextbin:
lodsb
cmp al,'0'
jb @@wrongnumber ; введённый символ меньше '0'
cmp al,'1'
ja @@wrongnumber ; введённый символ больше '1'
add al,255-'0' ; если это символ '0', то al=255 и CF=0; если '1', то al=0 и CF=1 (произошёл перенос через границу байта)
rcl dx,1 ; сдвигаем dx на 1 бит влево, записывая в младший бит значение флага CF, т. е. фактически введённый бит (0 или 1)
loop @@nextbin
; теперь у нас в dx число, которое нужно преобразовать в 8-ричное
xor cx,cx ; счётчик символов
@@nextoct:
mov al,dl
and al,7 ; получаем 3 младших бита
add al,'0' ; преобразуем их в цифру '0'..'7'
push ax ; сохраняем в стеке
inc cx ; увеличиваем счётчик символов
shr dx,3 ; сдвигаем dx на 3 бит вправо
jnz @@nextoct ; повторяем, если есть ещё цифры
; теперь у нас в стеке cx символов (цифр), которые нужно вывести на экран
mov ah,9
mov dx,offset OctMsg
int 21h ; вывод сообщения
@@output:
pop dx ; читаем записанные в стек цифры в обратном порядке
mov ah,2
int 21h ; выводим цифру на экран
loop @@output
@@exit:
int 20h ; выход из программы
@@wrongnumber:
mov ah,9
mov dx,offset WrongMsg
int 21h ; сообщение об ошибке ввода
jmp @@exit
.data
BinMsg db 'Bin = $'
OctMsg db 'Oct = $'
CRLF db 13,10,'$'
WrongMsg db 'Введённое число не является двоичным! $'
BinBuf db 17,? ; буфер для ввода до 16 символов
Bin db 17 dup (?) ; наше число
end Start
Удачи!
Похожие вопросы
- Ассемблер. из двоичной в одиннадцатиричную.
- Помогите с переводом в двоичную систему исчисления
- Сложный вопрос с переводом в двоичную систему!
- перевод чисел в двоичную,восьмеричную системы счисления
- Двоичный код - перевод (надо думать)
- Перевод символа в двоичный код.
- Как перевести число из двоичной системы счисления в восьмеричную в Ассемблер (tasm) Программа должна быть простой!
- Как перевести число из восьмеричной системы счисления в двоичную в Ассемблер (tasm) Программа должна быть простой!
- Ассемблер, двоичный код, и машинный код это одно и тоже?
- Что может ассемблер?