Вывод ASCII кодов символов - Assembler (223191)
Формулировка задачи:
Дорогие знатоки! Есть такое задание по Assembler: Написать программу, которая выводит на экран ASCII символы и их шестнадцатеричные коды, который пользователь введет с клавиатуры. Есть наработка, но вылетает программа при запуске, пожалуйста помогите.
Листинг программы
- cseg segment para 'code'
- assume cs:cseg
- org 100h
- begin proc near
- jmp start
- prop db '----------'
- mes db 'Enter symbols$'
- symbols label byte
- symb db 50
- symba db ?
- s db 50 dup ('$')
- vyvod label byte
- vyv db 50 dup ('$')
- start: mov ax,0002
- int 10h
- mov ah,02
- mov dx,0101
- int 10h
- mov ah,09
- lea dx,mes
- int 21h
- mov ah,02
- mov dx,0201
- int 10h
- mov ah,0Ah
- lea dx,symbols
- int 21h
- mov si,03
- mov di,00
- lea cx,symba
- k: push cx
- mov ah,02
- mov dh,[si]
- mov dl,01
- int 10h
- push si
- mov ah,09
- lea dx,s[di]
- int 10h
- mov ah,09
- lea dx,prop
- int 10h
- lea ax,s[di]
- call proc2
- pop si
- inc si
- inc di
- pop cx
- loop k
- up: mov ah,00
- int 16h
- cmp ah, 2ah
- jne up
- int 20h
- begin endp
- proc2 proc near
- mov cx,0
- mov si,0
- mov bh,10
- mov bl,0
- mov ah,0
- up2: cmp al,0
- je up3
- push ax
- div bh
- inc cx
- mov ah,0
- jmp up2
- up3: pop ax
- push ax
- mov al,bl
- mul bh
- mov bl,al
- pop ax
- push ax
- sub al,bl
- add al,'0'
- mov vyv[si],al
- inc si
- pop ax
- mov bl,al
- loop up3
- mov ah,09h
- lea dx,vyv[si]
- int 21h
- ret
- proc2 endp
- cseg ends
- end begin
Решение задачи: «Вывод ASCII кодов символов»
textual
Листинг программы
- .model small
- .stack 100h
- .data
- kbEsc equ 1Bh ;код Esc
- HexTabl db '0123456789abcdef'
- .code
- ;выводит на экран в 16 системе счисления
- ;содержимое регистра AL
- ShowHex PROC
- push ax
- push bx
- push cx
- mov cx, ax
- shr al, 1
- shr al, 1
- shr al, 1
- shr al, 1
- and ax, 000fh
- mov bx, OFFSET HexTabl
- xlat
- int 29h
- mov ax, cx
- and ax, 000fh
- xlat
- int 29h
- pop cx
- pop bx
- pop ax
- ret
- ShowHex ENDP
- main:
- mov ax, @data
- mov ds, ax
- @@Loop:
- mov ah, 00h
- int 16h
- cmp al, kbEsc
- je @@Break
- int 29h ;печать символа ASCII
- mov ah, al ;печать разделителя - пробела
- mov al, ' '
- int 29h
- mov al, ah ;печать кода символа
- call ShowHex
- mov ah, al ;печать разделителя - пробела
- mov al, ' '
- int 29h
- jmp @@Loop
- @@Break:
- @@Exit:
- mov ax, 4C00h ; выход в DOS
- int 21h
- end main
Объяснение кода листинга программы
- Устанавливается значение переменной
kbEsc
как 1Bh, что представляет собой код символаEscape
в шестнадцатеричной системе. - Объявляется переменная
HexTable
со значением '0123456789abcdef'. - Создается процедура
ShowHex
для вывода на экран символов в шестнадцатеричной системе счисления. - В основной программе
main
устанавливаются значения сегмента данных и регистра ds для доступа к данным. - В цикле @@Loop программа ожидает ввод символов с клавиатуры и сравнивает их с кодом
kbEsc
. - Если введен
kbEsc
, программа завершает работу, иначе выводит ASCII код введенного символа и его представление в шестнадцатеричной системе с помощью процедурыShowHex
. - Код завершается инструкцией для выхода в DOS. Этот код выглядит как комбинация Assembler и DOS команд для программирования на языке ассемблера для MS-DOS операционной системы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д