Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Kaligulaa
5 / 6 / 2
Регистрация: 18.05.2015
Сообщений: 124
1

Преобразовать двоичный код в десятичный

07.05.2016, 22:00. Просмотров 1354. Ответов 6
Метки нет (Все метки)

Ребят, нужно дополнить код, нужно, чтобы результат выполнения программы , то есть двоичный код преобразовался в десятичную СИ, при этом не используя стандартные функции.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
;   Prg_6_1.  asm   
;Источник: В.И.Юров. Assembler. Учебник для ВУЗОВ. 
;Программа~преобразования двузначного шестнадцатеричного числа
;в символьном виде в двоичное представление.
;Вход: исходное шестнадцатеричное число из двух цифр,
;вводится с клавиатуры.
;Выход: результат преобразования помещается в регистр dl.
;         
;   -----------------------------
data segment para public "data"   ;сегмент данных
message db    "Input two hexadecimal digits$"
data ends
stk segment stack
db   256 dup  ("?") ;сегмент стека
stk ends
code segment para public "code" ;начало сегмента кода
main proc; начало процедуры main
assume cs:code,ds:data,ss:stk
mov ax,data ;адрес сегмента данных в регистр ах 
mov ds,ax   ;ax в ds
mov ah,9
mov dx,offset message
int 21h
xor ax,ax   ;очистить регистр ax
mov ah,1h   ;1h в регистр ah
int 21h     ; генерация прерывания с номером 2lh
mov dl,al   ; содержимое регистра al в регистр dl
sub dl,30h  ; вычитание:   (dl) = (dl)-30h
cmp dl,9h   ; сравнить (dl) с 9h
jle M1      ;перейти на метку Ml, если dl<9h или dl=9h
sub dl,7h   ;вычитание: (dl)=(dl)-7h
M1:     ;определение метки M1
mov cl,4h   ;пересылка 4h в регистр cl
shl dl,cl   ;сдвиг содержимого dl нa 4 разряда влево
int 21h     ;вызов прерывания с номером 21h
sub al,30h  ;вычитание: (dl)=(dl)~30h
cmp al, 9h  ; сравнить (al) с 9h
jle M2      ; перейти на метку M2, если al<9h или al=9h
sub al,7h   ; вычитание: (al) = (al)-7h
M2: ;определение метки М2
add dl,al   ;сложение: (dl)=(dt)+(al)
mov ax,4c00h    ;пересылка 4c00h в регистр ах
int 21h     ;вызов прерывания с номером 2lh
main endp   ;конец процедуры main
code ends   ; конец сегмента кода
end main    ; конец программы с точкой входа main
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2016, 22:00
Ответы с готовыми решениями:

Преобразовать 16-ти разрядный двоичный код в код 8-4-2-1
Помогите пожалуйста составить программу для Intel 8051, которая преобразует 16-ти разрядный...

Перевод числа в двоично-десятичный код
Есть задание: Сформировать массив из 10 однобайтных чисел, перевести их в двоично-десятичный код,...

Перевод в двоичный код
Всем привет! Мне необходимо научиться переводить команды ассемблера в двоичный код. Где можно это...

Программа перевода символов в двоичный код
Нужно написать программу на assembler. С клавиатуры вводятся 5 символов,программа должна вывести...

Перевести команду ассемблера в двоичный код (остался только REX)
Дана команда: and ,dl После просмотра большого кол-ва литературы по ассемблеру было получено...

6
proc3nt
волшебник
1904 / 584 / 183
Регистрация: 26.05.2012
Сообщений: 1,694
07.05.2016, 23:18 2
Лучший ответ Сообщение было отмечено Kaligulaa как решение

Решение

Цитата Сообщение от Kaligulaa Посмотреть сообщение
двоичный код преобразовался в десятичную
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mov ax,  <-двоичный код
mov bx,10
xor cx,cx
cnv:
xor dx,dx
div bx
push dx
inc cx
or ax,ax
jnz cnv
    
mov ah,02h
print:
pop dx
add dl,30h
int 21h
loop print
1
Kaligulaa
5 / 6 / 2
Регистрация: 18.05.2015
Сообщений: 124
08.05.2016, 22:11  [ТС] 3
а куда его можно вставить , в какой блок кода?
0
proc3nt
волшебник
1904 / 584 / 183
Регистрация: 26.05.2012
Сообщений: 1,694
08.05.2016, 22:30 4
сразу же после того, как результат преобразования в двоичное представление помещен в регистр dl
0
Kaligulaa
5 / 6 / 2
Регистрация: 18.05.2015
Сообщений: 124
10.05.2016, 11:26  [ТС] 5
ругается на строчку mov bx,10
пишет Operand types do not match

Добавлено через 13 минут
прошу прощения, на mov ax,dl

Добавлено через 3 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
data segment para public "data" ;начало сегмента данных
message db 'Enter: $'  ; строка (приглашение для ввода двух символов с клавиатуры) 
data ends   ;конец сегмента данных
 
stk segment stack ;начало сегмента стека
db 256 dup ("?")  ;выделение памяти под стек 
stk ends          ;конец сегмента стека
 
code segment para public "code" ;начало сегмента кода
main proc   ;начало процедуры
assume cs:code,ds:data,ss:stk ;сопоставление сегментных регистров и сегментов 
mov ax,data  
mov ds,ax   ;инициализация сегмента данных через  регистр ax
mov ah,9    ;функция вывода сообщения на экран
mov dx,offset message   ;адрес начала сообщения
int 21h     ;прерывание, чтобы функция выполнилась
xor ax,ax   ;обнуление регистра ax 
mov ah,1h   ;функция ввода с клавиатуры символа с эхом 
int 21h     ;прерывание, чтобы функция выполнилась 
            ;ASCII-код введенного символа помещается в регистр al
mov dl,al   ;помещаем ASCII-код введенного символа в регистр dl
sub dl,30h  ;предполагаем, что была нажата цифра. преобразовываем ASCII-код цифры в символ 
cmp dl,9h   ;проверяем, действительно ли была нажата цифра
jle M1      ;если была нажата цифра, то прыгаем на метку M1   
sub dl,7h   ;если была нажата буква, то дополнительно преобразовываем ASCII-код буквы в символ
M1:         ;метка M1
mov cl,4h   ;один шестнадцатеричный символ занимает 4 бита (полубайт)  
shl dl,cl   ;сдвигаем символ из младшего полубайта в старший   
int 21h     ;вводим второй символ. прерывание, чтобы функция ввода выполнилась
sub al,30h  ;предполагаем, что была нажата цифра. преобразовываем ASCII-код цифры в символ 
cmp al, 9h  ;проверяем, действительно ли была нажата цифра 
jle M2      ;если была нажата цифра, то прыгаем на метку M2
sub al,7h   ;если была нажата буква, то дополнительно преобразовываем ASCII-код буквы в символ
M2:         ;метка M2
add dl,al   ;помещаем символ в младший полубайт
mov ax,4c00h;функция выхода из программы. код возврата - ноль   
int 21h     ;прерывание, чтобы функция выполнилась 
mov ax,dl   ;помещяем в ах двоичный код
mov bx,10
xor cx,cx   ;обнуление cx
cnv:        ;метка
xor dx,dx   ;обнуление dx
div bx
push dx
inc cx
or ax,ax
jnz cnv    ;перейти, если не равно  
mov ah,02h
print:
pop dx
add dl,30h
int 21h
loop print
main endp   ;конец процедуры
code ends   ;конец сегмента кода
end main    ;указывается метка (процедура), с которой должна начаться выполняться программа
скорее всего я что-то сделал криво
0
Constantin Cat
10547 / 1465 / 418
Регистрация: 28.02.2015
Сообщений: 2,975
Завершенные тесты: 1
10.05.2016, 11:36 6
AX -16 bit
DL - 8 bit
потому и несоответсвует тип.
0
proc3nt
волшебник
1904 / 584 / 183
Регистрация: 26.05.2012
Сообщений: 1,694
10.05.2016, 12:29 7
Цитата Сообщение от Kaligulaa Посмотреть сообщение
mov ax,dl ;помещяем в ах двоичный код
замени на
Assembler
1
2
xor ah, ah
mov al, dl
Цитата Сообщение от Kaligulaa Посмотреть сообщение
mov ax,4c00h ;функция выхода из программы. код возврата - ноль
int 21h ;прерывание, чтобы функция выполнилась
функция говорит сама за себя, что эти строки должны располагаться перед выходом из процедуры
0
10.05.2016, 12:29
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2016, 12:29

Базовые понятия: как перевести в асме слово в двоичный код?
Как перевести в асме слово в двоичный код? По определению слово занимает 2 байта или 65536. Когда...

Преобразовать код из С++ в код Ассемблера
Прошу о помощи. В условии надо поменять местами первую четверть массива со второй, а третью с...

Преобразовать двоичный код в двоично-десятичный код (Intel 8051)
Прочитать с порта Р0 один байт двоичного кода 8-4-2-1, превратить его в двоично-десятичный код и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.