Перевод из десятичной в шестнадцатеричную - Assembler
Формулировка задачи:
Хотел бы добавить в профильную тему, однако она закрыта, может кому понадобится, код полностью рабочий (проверял в EMU8086). От себя бы что еще хотелось, так это проверить, насколько он компактный и кому не сложно реализовать перевод еще в двоичную так как и сделана мною перевод шестнадцатеричную.
.Model tiny .Code org 100h start: mov dx, offset messagel mov ah, 9 int 21h mov dx, offset buffer mov ah, 0Ah int 21h mov dx, offset crlf mov ah, 9 int 21h xor di, di xor ax, ax mov cl, blength xor ch, ch xor bx, bx mov si, cx mov cl, 10 asc2hex: mov bl, byte ptr bcontents [di] sub bl, '0' jb asc_error cmp bl, 9 ja asc_error mul cx add ax, bx inc di cmp di, si jb asc2hex push ax mov ah, 9 mov dx, offset message2 int 21h pop ax push ax xchg ah, al call print_al pop ax call print_al Ret asc_error: mov dx, offset err_msg mov ah, 9 int 21h Ret print_al: mov dh, al and dh, 0Fh shr al, 4 call print_nibble mov al, dh print_nibble: cmp al, 10 sbb al, 69h Das mov dl, al mov ah, 2 int 21h Ret messagel db "Desatkove chislo: $" message2 db "Shistnkadcatkove chislo: $" err_msg db "Pomulka!" crlf db 0Dh, 0Ah, '$' Buffer db 6 blength db ? bcontents: end start
Решение задачи: «Перевод из десятичной в шестнадцатеричную»
textual
Листинг программы
. Model tiny ; модель памяти, в которой сегменты кода, данных и стека объединены. . Code ; сегмент кода, который содержит данные. org 100h ; начало СОМ-файла Begin: ; метка начала кода программы call Wait_key ; вызываем подпрограмму cmp al, 27 ; сравниваем значение в al с кодом 27 (ESC) ; если да - то на метку Quit_prog je Quit_prog cmp al, 0 ; код клавиши расширенный? (F1-F12 и т.п.) je Begin ; Если «да» - повторяем запрос call Out_char ; вызываем процедуру вывода нажатой клавиши на экран jmp Begin ; ждем дальше ... Quit_prog: ; метка, на которую придет программа в случае нажатия ESC mov al, 32 ; помещаем в AL <пробел> call Out_char ; вызываем процедуру вывода символа в AL int 20h ; выход Wait_key proc ; процедура ожидания клавиши от пользователя mov ah, 10h ; окончания подпрограммы int 16h ; прерывания DOS Ret ; функция DOS "завершить работу процедуры" Wait_key endp ; окончания процедуры Wait_key Out_char proc ; начало процедуры out_char push cx ; сохраним все регистры, которые будут изменены подпрограммой push ax ; Делаем это для того, чтобы в дальнейшем не было путаницы push es ; Сохраняем сегментный регистр push ax ; сохраняем AX, т.к в нем код нажатой клавиши ... mov ax, 0B800h ; установливать ES на сегмент видеобуфера mov es, ax mov di, 0 ; DI - первый символ первой строки mov cx, 2000 ; выводим 2000 символов (80 символов в строке 25 строк) pop ax ; восстановим код клавиши mov ah, 31 ; цвет символа Next_sym: ; метка для цикла mov es: [di], ax ; заносим код клавиши и ее цвет (цвет всегда 31) inc di ; увеличиваем указатель на 2 (первый байт - символ второй байт - цвет) inc di loop Next_sym ; обработка следующего символа pop es ; восстановим сохраненые регистры и выровненный стек pop ax ; восстановим сохраненые регистры и выровненный стек pop cx ; восстановим сохраненые регистры и выровненный стек Ret ; вернемся из процедуры Out_char endp ; окончания процедуры Out_char end Begin ; метка окончания кода программы
Объяснение кода листинга программы
- Объявлены сегменты кода, данных и стека, а также модель памяти, в которой они объединены.
- Начало СОМ-файла отмечено орг-кодом.
- Начало кода программы помечено меткой Begin.
- Вызывается подпрограмма Wait_key для ожидания нажатия клавиши.
- Проверяется, была ли нажата клавиша ESC (27). Если да, то программа переходит на метку Quit_prog.
- Проверяется, была ли нажата клавиша с кодом 0 (расширенный код клавиши). Если да, то программа возвращается к началу запроса (Begin).
- Вызывается подпрограмма Out_char для вывода нажатой клавиши на экран.
- Программа переходит к метке Begin для ожидания дальнейшего ввода.
- Если клавиша была ESC, то в регистре AL помещается код клавиши 32 (пробел).
- Вызывается подпрограмма Out_char для вывода символа в AL на экран.
- Программа выходит из системы с помощью прерывания DOS 20h.
- Начало процедуры ожидания клавиши от пользователя (Wait_key).
- Устанавливается сегментный регистр ES на сегмент видеобуфера (0B800h).
- Сохраняются регистры AX, CX, ES и DI.
- Задается начальный адрес первой строки для вывода (DI = 0).
- Задается количество символов для вывода (CX = 2000).
- Восстанавливаются сохраненные регистры AX, CX, ES и DI.
- Выполняется цикл для вывода каждого символа (Next_sym).
- Код клавиши и ее цвет записываются в видеобуфер (mov es:[di], ax).
- Увеличивается указатель DI на 2 байта (первый байт - символ, второй байт - цвет).
- Цикл продолжается до тех пор, пока не будут обработаны все символы.
- Восстанавливаются сохраненные регистры и выравнивается стек.
- Программа возвращается из процедуры Out_char.
- Конец кода программы помечен меткой end Begin.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д