Вывод фамилии, имени и отчества по нажатию различных клавиш - Assembler
Формулировка задачи:
задание: по нажатию клавиши PageUp выводится фамилия вертикально, по нажатию клавиши PageDown - имя горизонтально, по нажатию клавиши F7 - отчество вертикально. выводится в фамилии только буква о. не понимаю что делать(((
.MODEL small ;определяем модель вычислений. .STACK 100h ;определяем сегмент стека и задаем его, задаем размер. .DATA ;определяем сегмент данных. fam1 db 'P$' ;строковая переменная фамилии fam2 db 'e$' fam3 db 'd$' fam4 db 'r$' fam5 db 'o$' im db 'Vlad$' ;строковая переменная имени otch1 db 'Y$' ;строковая переменная отчества otch2 db 'u$' otch3 db 'r$' otch4 db 'e$' otch5 db 'v$' otch6 db 'i$' otch7 db 'c$' otch8 db 'h$' .CODE ;определяем сегмент кода. mov ax, @data ; инициализируем сегмент данных. mov ds, ax ;в DSзаносим адрес начала сегмента данных. b: mov ah,7 ;вызов функции ввода с клавиатуры int 21h ;вызов прерывания cmp al,49h je l cmp al,51h je k cmp al,41h je j cmp al,1bh je e jmp b l: mov dx,offset fam1 mov ah,09h mov dx,offset fam2 mov ah,09h mov dx,offset fam3 mov ah,09h mov dx,offset fam4 mov ah,09h mov dx,offset fam5 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 b k: mov dx,offset im 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 b j: mov dx,offset otch1 mov ah,09h mov dx,offset otch2 mov ah,09h mov dx,offset otch3 mov ah,09h mov dx,offset otch4 mov ah,09h mov dx,offset otch5 mov ah,09h mov dx,offset otch6 mov ah,09h mov dx,offset otch7 mov ah,09h mov dx,offset otch8 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 b e: mov ah,4ch int 21h END
Решение задачи: «Вывод фамилии, имени и отчества по нажатию различных клавиш»
textual
Листинг программы
;FASM org 100h start: xor ax, ax mov es, ax mov cx, ax mov dh, byte [es:484h] ; rows on screen mov dl, byte [es:44Ah] ; cols -//- mov ah,6 mov bx, 700h int 10h mov dx, cx xchg bh,bl mov ah,2 int 10h again: mov ah,00h ; getch(); int 16h cmp ah,1 jz gtfo cmp ah, 49h ; <PgUp> jnz @F mov si, fam mov cx, flen mov dx, [fXY] add [fXY], 101h call wr_vert jmp again @@: cmp ah, 41h ;<F7> jnz @F mov si, midnm mov cx, mlen mov dx, word [mX] dec [mX] inc [mY] call wr_vert jmp again @@: cmp ah, 51h ;<PgDn> jnz again mov cx, nlen mov dx, word [nX] inc [nY] mov ah, 2 ; выставить позицию курсора mov bx,0 ; видеостраница 0 int 10h mov dx, name mov ah,9 int 21h jmp again gtfo: ret wr_vert: ; mov si, dx ; возвращаем указатель взад mov di, 1 ; начальный атрибут, синий mov bp, di ; сколько раз вывести символ, потом пригодится ; xor dx, dx ; начальные координаты: 0,0 ; mov cx, len ; длина мессаги @@: mov ah, 2 ; выставить позицию курсора mov bx,0 ; видеостраница 0 int 10h push dx ; сохраняем координаты xchg cx, bp ; CX=1, сколько раз вывести символ push ax ; сохраняем двойку lodsb ; AL=символ из строки xchg di, bx ; BH=видеостраница(0), BL=атрибут mov ah,9 ; выводим int 10h ; символ xchg cx, bp ; вертаем взад длину строки pop ax ; -//- # ф-ции pop dx ; -//- координаты inc dh ; увеличиваем # строки inc bl ; прибавляем аттрибут xchg di, bx loop @B ; по длине строки ret ; gtfo fXY dw 0;101h mX db 4Fh mY db 1h nX db 19h nY db 0 fam: db 'Petrov' flen = $ - fam name: db 'Vlad$' nlen = $ - name midnm: db "Yur'evich" mlen = $ - midnm