Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике | Номер выпуска: | 1485 | | Дата выхода: | 04.11.2011, 01:00 | | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | | Подписчиков / экспертов: | 193 / 61 | | Вопросов / ответов: | 1 / 1 | Консультация # 184347: Здравствуйте! У меня возникли сложности с таким вопросом: необходимо написать в TASM программу благодаря которой введенное с клавиатуры число в 16 -ной системе счисления будет преобразовано и выведено на экран в виде двоичного числа.... Консультация # 184347: Здравствуйте! У меня возникли сложности с таким вопросом: необходимо написать в TASM программу благодаря которой введенное с клавиатуры число в 16 -ной системе счисления будет преобразовано и выведено на экран в виде двоичного числа. Дата отправки: 29.10.2011, 16:40 Вопрос задал: Невалёный Виталий Владимирович (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Невалёный Виталий Владимирович! Для ввода hex-числа написана своя процедура. После ввода в буфере получаем hex-цифры 00h-0fh При выводе группируем по две hex-цифры (побайтно) При нечетном количестве дополняем самый старший байт цифрой 0. Ну и напоследок, для получения символов '0' или '1' из hex-цифры, последовательно сдвигаем очередной бит в FC и складываем с 30h командой adc
Код : ;ввести с клавиатуры число в 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  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 29.10.2011, 18:10 5 СПАСИБО ----- Дата оценки: 29.10.2011, 18:18 | Рейтинг ответа: 0 |
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий