Перевод из десятичной в шестнадцатеричную - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д