Вывод фамилии, имени и отчества по нажатию различных клавиш - 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

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

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