Консультация № 184347
29.10.2011, 16:40
60.32 руб.
0 8 1
Здравствуйте! У меня возникли сложности с таким вопросом:
необходимо написать в TASM программу благодаря которой введенное с клавиатуры число в 16 -ной системе счисления будет преобразовано и выведено на экран в виде двоичного числа.

Обсуждение

давно
Посетитель
7438
7205
29.10.2011, 18:10
общий
это ответ
Здравствуйте, Невалёный Виталий Владимирович!
Для ввода hex-числа написана своя процедура.
После ввода в буфере получаем hex-цифры 00h-0fh
При выводе группируем по две hex-цифры (побайтно)
При нечетном количестве дополняем самый старший байт цифрой 0.
Ну и напоследок, для получения символов '0' или '1' из hex-цифры,
последовательно сдвигаем очередной бит в FC и складываем с 30h командой adc
[code h=207];ввести с клавиатуры число в 16 -ной системе счисления
;и вывести на экран в виде двоичного числа

stk segment para stack ;Сегмент стека с выравниваем на 10h (para)
dw 256 dup (?)
stk ends

data segment
sHex db 'Enter hex: $'
sBin db 0dh,0ah,'Bin: $'
sAny db 0dh,0ah,'Press any key$'

;данные для ввода строки с помощью функции 0ah
buffer label byte
max db 16 ;размер буфера
cnt db 0 ;длина введенной hex-строки
hexnums db 16 dup (?) ;сама введенная hex-строка
data ends

code segment
assume cs:code, ds:data, ss:stk
main proc
mov ax, data ;ds = es = data
mov ds, ax
mov es, ax

lea dx, sHex ;Enter hex:
mov ah, 9
int 21h

lea bx, buffer ;Введем hex-число
call GetHex

lea dx, sBin ;Bin:
mov ah, 9
int 21h

call OutBin ;Выведем двоичную строку, данные в [bx]

lea dx, sAny ;выводим строку Press any key
mov ah, 9
int 21h

mov ah, 0 ;ждем "any key"
int 16h

mov ax, 4c00h
int 21h
main endp

;Введем hex-строку
;[bx] - адрес структуры, аналогичной для функции 0ah
GetHex proc
lea di, [bx+2] ;адрес строки
xor cx, cx ;счетчик
GH_loop:
mov ah, 0 ;ждем код
int 16h
cmp al, 0dh ;по Enter-у заканчиваем ввод
je GH_ret
cmp al, 8 ;backspace для исправления ошибки
je GH_backspace
cmp cl, [bx] ;проверим на переполнение буфера
je GH_beep ;первый байт - макс длина
cmp al, '0' ;меньше цифр
jb GH_loop ;игнорируем
cmp al, '9'
jbe GH_set_digit ;цифра - запоминаем
or al, 20h ;сделаем букву маленькой
cmp al, 'a'
jb GH_loop ;меньше 'a' игнорируем
cmp al, 'f'
ja GH_loop ;и больше 'f'
mov dl, al ;запомнили для вывода на экран
sub al, 'a'-10 ;сделаем hex-цифру 'a'-'f' -> 0ah-0fh
GH_set:
inc cx ;считаем
mov [di], al ;запоминаем
inc di ;адрес следующей hex-цифры
GH_out:
mov ah, 2 ;выводим введенный символ (в dl)
int 21h
jmp GH_loop
GH_set_digit: ;цифра
mov dl, al ;сохраним для вывода
sub al, '0' ;превратим в hex-цифру '0'-'9' -> 00h-09h
jmp GH_set ;запоминаем
GH_backspace: ;backspace
jcxz GH_loop ;в начале строки игнорируем
dec cx ;уменьшаем счетчик
dec di ;и адрес
mov dl, al ;уменьшим адрес
mov ah, 2
int 21h
mov dl, ' ' ;затрем пробелом
int 21h
mov dl, 8 ;и опять на одну позицию назад
jmp GH_out
GH_beep:
mov dl, 7 ;при переполнении буфера просигналим beep-ом
jmp GH_out
GH_ret:
mov [bx+1], cl ;запоминаем длину hex-строки
ret
GetHex endp

OutBin proc ;вывод последовательности 0 и 1
lea si, [bx+2] ;адрес строки
xor cx, cx ;длина
mov cl, [bx+1] ; строки
jcxz OB_ret ;пустая строка
mov ah, 2 ;ф-я вывода на экран
test cl, 1 ;для нечетной длины дополним старшую тетраду нулем
jz OB_loop ;для четной - на вывод
mov al, '0' ;0 в старшую тетраду
inc cx ;добавим и счетчик цикла
jmp OB_continue ;обойдем чтение байт
OB_loop: ;цикл чтения hex чисел
lodsb ;очередная тетрада
OB_continue:
push cx
mov cx, 4 ;выводим только 4 бит младшей тетрады
shl al, 4 ;делаем их старшими
OB_bit: ;цикл по битам
shl al, 1 ;старший бит в С
push ax ;сохраним
mov dl, '0'
adc dl, 0 ;dl = '0' или '1'
int 21h ;выводим
pop ax
loop OB_bit ;4 бита
pop cx ;счетчик тетрад
test cl, 1 ;разделим пробелом на границе 8 бит
jz OB_next ;четное число - в середине байта
mov dl, ' ' ;пробел для наглядности
int 21h
OB_next:
loop OB_loop ;по всем тетрадам
OB_ret:
ret
OutBin endp

code ends
end main[/code]
5
СПАСИБО
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
30.10.2011, 12:48
общий
добрый день. а можно сделать ту же самую программу без подпрограмм, массива и директивы lea?
Неизвестный
30.10.2011, 14:38
общий
Адресаты:
добрый день. а можно сделать ту же самую программу без подпрограмм, массива и директивы lea?
давно
Посетитель
7438
7205
30.10.2011, 16:12
общий
А чем Вам не угодили подпрограммы с массивами и, особенно, lea?
Если не использовать хранение в массиве, тогда можно сделать ввод hex-цифры и тут же вывод в виде бит.
Типа так:
Hex: a = 1010
Так пойдет?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
30.10.2011, 18:21
общий
пойдет! прошу вашей помощи
Неизвестный
30.10.2011, 18:24
общий
такие требования к программе.без подпрограмм я то переписал код, а вот без lea и массивов не получилось в результате программа совсем перестала работать
давно
Посетитель
7438
7205
30.10.2011, 19:36
общий
Держите...
[code h=207];ввести с клавиатуры число в 16 -ной системе счисления
;и вывести на экран в виде двоичного числа

stk segment para stack ;Сегмент стека с выравниваем на 10h (para)
dw 256 dup (?)
stk ends

data segment
sHex db 'Enter hex: $'
data ends

code segment
assume cs:code, ds:data, ss:stk
main proc
mov ax, data ;ds = es = data
mov ds, ax
mov es, ax

GH_loop:
lea dx, sHex ;Enter hex:
mov ah, 9
int 21h

GH_key:
mov ah, 0 ;ждем код
int 16h
cmp al, 1bh ;по Esc выходим
je GH_ret
cmp al, '0' ;меньше цифр
jb GH_key ;игнорируем
cmp al, '9'
jbe GH_digit ;цифра - выводим

or al, 20h ;сделаем букву маленькой
cmp al, 'a'
jb GH_key ;меньше 'a' игнорируем
cmp al, 'f'
ja GH_loop ;и больше 'f'
mov dl, al ;сохраним hex-символ для вывода
sub al, 'a'-10 ;сделаем hex-цифру 'a'-'f' -> 0ah-0fh
GH_out:
mov ah, 2
push ax
int 21h ;выведем hex из dl
mov dl, ' '
int 21h
mov dl, '=' ;' = '
int 21h
mov dl, ' '
int 21h
pop ax
mov cx, 4 ;выводим только 4 бит младшей тетрады
shl al, 4 ;делаем их старшими
OB_bit: ;цикл по битам
shl al, 1 ;старший бит в С
push ax ;сохраним
mov dl, '0'
adc dl, 0 ;dl = '0' или '1'
int 21h ;выводим
pop ax
loop OB_bit ;4 бита
mov dl, 0dh
int 21h
mov dl,0ah ;перевод строки
int 21h
jmp GH_loop
GH_digit: ;цифра
mov dl, al ;сохраним hex-символ для вывода
sub al, '0' ;превратим в hex-цифру '0'-'9' -> 00h-09h
jmp GH_out ;выводим

GH_ret:
mov ax, 4c00h
int 21h
main endp

code ends
end main[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
30.10.2011, 21:45
общий
спасибо
Форма ответа