Вывод текста на экран - Assembler (224996)

Узнай цену своей работы

Формулировка задачи:

Помогите переделать код. Задача следующая: При нажатии клавиши "

F1

" выводим на экран "Ivanov", при нажатии "

F2

" - "Ivan" (задом на перед, а именно "navI"), при нажатии "

F3

" - "Ivanovich" (по вертикали, а именно [см. ниже]),"

Esc

" - завершение программы. I v a n o v i c h С фамилией вроде нет проблем, а с именем и отчеством я запутался
.model small   ; Объявляем модель памяти
.stack 100h    ; Объявляем размер стека
.data          ; Определяем сегмент данных
 familiya db 'Ivanov $'         ;строковая переменная фамилии
 imya db 'Ivan $'                 ;строковая переменная имени
 otchestvo db 'Ivanovich $'   ;строковая переменная отчества
.CODE
mov ax,@data        ;инициализируем сегмент данных
mov ds,ax       ;заносим в DS адрес начала сегмента данных
 
metka:
mov ah,7        ;вызов функции ввода с клавиатуры
int 21h         ;вызов прерывания
 
cmp al,3Bh      ;F1 - фамилия
je f
 
cmp al,3Ch      ;F2 - имя
je i
 
cmp al,3Dh      ;F3 - отчество
je o
 
cmp al,01h      ;Esc - выход
je exit
 
jmp metka
 
f:
;------------------------------------вывод фамилии
mov dx,offset familiya
mov ah,09h
int 21h
;------------------------------------переход на новую строку
mov al, 0dh
int 29h
mov al, 0ah
int 29h
mov al, 0dh
int 29h
mov al, 0ah
int 29h
jmp metka
 
i:
;------------------------------------вывод имени
mov dx,offset imya
mov ah,09h
int 21h
;------------------------------------переход на новую строку
mov al, 0dh
int 29h
mov al, 0ah
int 29h
mov al, 0dh
int 29h
mov al, 0ah
int 29h
jmp metka
 
o:
;------------------------------------вывод отчества
mov dx,offset otchestvo
mov ah,09h
int 21h
;------------------------------------переход на новую строку
mov al, 0dh
int 29h
mov al, 0ah
int 29h
mov al, 0dh
int 29h
mov al, 0ah
int 29h
jmp metka

exit:
mov ah,4ch      ;выход
int 21h
END
Буду очень признателен

Решение задачи: «Вывод текста на экран»

textual
Листинг программы
.model  small           ; Объявляем модель памяти
.stack              ; Объявляем сегмент стека
.data               ; Определяем сегмент данных
fam db 'Ivanov',0       ;строковая переменная фамилии
nam db 'Ivan',0     ;строковая переменная имени
mid db 'Ivanovich',0    ;строковая переменная отчества
tbl dw  wr_hor      ;F1 - фамилия
    dw  wr_rev      ;F2 - имя
    dw  wr_vert     ;F3 - отчество
.CODE
start:
    mov ax,@data        ;инициализируем сегмент данных
    mov ds,ax           ;заносим в DS адрес начала сегмента данных
    mov es,ax           ;заносим в ES адрес начала сегмента данных
 
again:
    xor ax,ax           ;вызов функции ввода с клавиатуры
    int 16h         ;вызов прерывания
    cmp ah,1
    jz  gtfo            ;Esc - выход
    sub ah, 3Bh
    js  again
    cmp ah, 3
    ja  again
    xor bx,bx
    mov bl,ah
    shl bx,1
    call    tbl[bx]
    call    crlf
    jmp again
;------------------------------------переход на новую строку
crlf:   mov ax, 0D0Ah
    call    @F
@@: xchg    ah,al
    int 29h
    ret 
 
;------------------------------------вывод фамилии
wr_hor:
    mov si,offset fam
@@: lodsb
    or  al,al
    jz  @F
    int 29h
    jmp @B
@@: ret
 
;------------------------------------вывод имени
wr_rev: mov di,offset nam
    xor al, al
    xor cx,cx
    dec cx
    repne   scasb
    dec di
@@: dec di
    mov al,[di]
    or  al,al
    jz  @F
    int 29h
    jmp @B
@@: ret
;------------------------------------вывод отчества
wr_vert:mov si,offset mid
@@: lodsb
    or  al,al
    jz  @F
    int 29h
    call    crlf
    jmp @B
@@: ret
 
 
gtfo:
    mov ah,4ch          ;выход
    int 21h
    END start

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

  1. Объявляем модель памяти, сегменты стека и данных
  2. Определяем строковые переменные фамилии, имени и отчества
  3. Задаем таблицу функций ввода с клавиатуры (F1-F3)
  4. Код начинается с инициализации сегмента данных и заносит его в регистры DS и ES
  5. Затем происходит бесконечный цикл, пока пользователь не введет последовательность клавиш Esc, F3 или F1
  6. При вводе последовательности клавиш Esc или F3 происходит выход из программы
  7. При вводе последовательности клавиш F1 происходит вызов функции вывода на экран фамилии
  8. При вводе последовательности клавиш F2 происходит вызов функции вывода на экран имени
  9. При вводе последовательности клавиш F3 происходит вызов функции вывода на экран отчества
  10. Для перехода на новую строку используется функция вывода символа перевода строки
  11. Для вывода фамилии используется функция вывода строки, заданная в таблице (wr_hor)
  12. Для вывода имени используется функция вывода строки, заданная в таблице (wr_rev)
  13. Для вывода отчества используется функция вывода строки, заданная в таблице (wr_vert)
  14. При нажатии клавиши Esc происходит выход из программы
  15. Код завершается END start

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

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