Вывод текста на экран - 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
Объяснение кода листинга программы
- Объявляем модель памяти, сегменты стека и данных
- Определяем строковые переменные фамилии, имени и отчества
- Задаем таблицу функций ввода с клавиатуры (F1-F3)
- Код начинается с инициализации сегмента данных и заносит его в регистры DS и ES
- Затем происходит бесконечный цикл, пока пользователь не введет последовательность клавиш Esc, F3 или F1
- При вводе последовательности клавиш Esc или F3 происходит выход из программы
- При вводе последовательности клавиш F1 происходит вызов функции вывода на экран фамилии
- При вводе последовательности клавиш F2 происходит вызов функции вывода на экран имени
- При вводе последовательности клавиш F3 происходит вызов функции вывода на экран отчества
- Для перехода на новую строку используется функция вывода символа перевода строки
- Для вывода фамилии используется функция вывода строки, заданная в таблице (wr_hor)
- Для вывода имени используется функция вывода строки, заданная в таблице (wr_rev)
- Для вывода отчества используется функция вывода строки, заданная в таблице (wr_vert)
- При нажатии клавиши Esc происходит выход из программы
- Код завершается END start