Вывод 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

Объяснение кода листинга программы

  1. Устанавливается значение переменной kbEsc как 1Bh, что представляет собой код символа Escape в шестнадцатеричной системе.
  2. Объявляется переменная HexTable со значением '0123456789abcdef'.
  3. Создается процедура ShowHex для вывода на экран символов в шестнадцатеричной системе счисления.
  4. В основной программе main устанавливаются значения сегмента данных и регистра ds для доступа к данным.
  5. В цикле @@Loop программа ожидает ввод символов с клавиатуры и сравнивает их с кодом kbEsc.
  6. Если введен kbEsc, программа завершает работу, иначе выводит ASCII код введенного символа и его представление в шестнадцатеричной системе с помощью процедуры ShowHex.
  7. Код завершается инструкцией для выхода в DOS. Этот код выглядит как комбинация Assembler и DOS команд для программирования на языке ассемблера для MS-DOS операционной системы.

Оцени полезность:

15   голосов , оценка 3.733 из 5
Похожие ответы