NorB
01.10.2009, 19:19
Есть задание :
Вывод символа с клавиатуры на позицию экрана, указанную курсором, с модификацией положения курсора.
Есть код:
.model small
.stack 100h
.data
x db 30
y db 10 ;начальные координаты курсора
.code
.startup
;очистка экрана
mov ax, 0B800h;номер сегмента видеобуфера в АХ
mov es, ax ;ассоциируем видеобуфер с EХ
mov al, " ";символ
mov ah, 00000111B;атрибут - белое на черном
mov cx, 2000
xor bx, bx ;ВХ=0 (указатель на символ)
;m:
mov es:[bx], ax ;запись в видеобуфер символа и атрибута
add bx,2 ;увеличиваем указатель на следующий символ
loop m ;цикл очистки видеобуфера
;вычисление абсолютного номера позиции курсора
mov al, 80
mov bl, y
mul bl
xor bx, bx
mov bl, x
add ax, bx ;AX=80*y+x
mov bx, ax ;адрес курсора в BX
push bx
add bx, bx ;bx=bx*2
mov cx, bx ;адрес символа в СХ
pop bx
again: ;начало ввода символов
;запись позиции курсора в КЭЛТ
mov al, 0eh
mov dx, 3d4h
out dx,al ;выбрали 14 регистр КЭЛТ
mov dx, 3d5h
mov al, bh
out dx, al ;записали в него старший байт адреса курсора
mov al, 0fh
mov dx, 3d4h
out dx,al ;выбрали 15 регистр КЭЛТ
mov dx, 3d5h
mov al, bl
out dx, al ;записали в него младший байт адреса курсора
;запись позиции курсора в буфер BIOS
mov ax, 40h
mov es, ax ;es указывает на область данных BIOS
mov ah, y
mov al, x
mov es:50h, ax ;запись положения курсора в буфер курсора BIOS
mov ax, 0B800h;номер сегмента видеобуфера в АХ
mov es, ax ;ассоциируем видеобуфер с EХ
mov ah, 08h
int 21h;ввод символа без эха (в AL - код символа)
cmp al, 1Bh ;не нажат ли ESC
je go
cmp al, 20h
jl again ;фильтруем небуквенные символы
mov ah, 00000111B;атрибут - белое на черном
push bx
mov bx, cx
mov es:[bx], ax ;вывод символа
pop bx
add cx, 2 ;смещаем на следующий символ указатель на символ в видеопамяти
inc bx ;увеличиваем номер позиции курсора
jmp again;бесконечный цикл с выходом по ESC
go:
.exit 0
end
Че с ним нетак?=( я его транслирую линкую и программа просто висит а не работает:(
Вывод символа с клавиатуры на позицию экрана, указанную курсором, с модификацией положения курсора.
Есть код:
.model small
.stack 100h
.data
x db 30
y db 10 ;начальные координаты курсора
.code
.startup
;очистка экрана
mov ax, 0B800h;номер сегмента видеобуфера в АХ
mov es, ax ;ассоциируем видеобуфер с EХ
mov al, " ";символ
mov ah, 00000111B;атрибут - белое на черном
mov cx, 2000
xor bx, bx ;ВХ=0 (указатель на символ)
;m:
mov es:[bx], ax ;запись в видеобуфер символа и атрибута
add bx,2 ;увеличиваем указатель на следующий символ
loop m ;цикл очистки видеобуфера
;вычисление абсолютного номера позиции курсора
mov al, 80
mov bl, y
mul bl
xor bx, bx
mov bl, x
add ax, bx ;AX=80*y+x
mov bx, ax ;адрес курсора в BX
push bx
add bx, bx ;bx=bx*2
mov cx, bx ;адрес символа в СХ
pop bx
again: ;начало ввода символов
;запись позиции курсора в КЭЛТ
mov al, 0eh
mov dx, 3d4h
out dx,al ;выбрали 14 регистр КЭЛТ
mov dx, 3d5h
mov al, bh
out dx, al ;записали в него старший байт адреса курсора
mov al, 0fh
mov dx, 3d4h
out dx,al ;выбрали 15 регистр КЭЛТ
mov dx, 3d5h
mov al, bl
out dx, al ;записали в него младший байт адреса курсора
;запись позиции курсора в буфер BIOS
mov ax, 40h
mov es, ax ;es указывает на область данных BIOS
mov ah, y
mov al, x
mov es:50h, ax ;запись положения курсора в буфер курсора BIOS
mov ax, 0B800h;номер сегмента видеобуфера в АХ
mov es, ax ;ассоциируем видеобуфер с EХ
mov ah, 08h
int 21h;ввод символа без эха (в AL - код символа)
cmp al, 1Bh ;не нажат ли ESC
je go
cmp al, 20h
jl again ;фильтруем небуквенные символы
mov ah, 00000111B;атрибут - белое на черном
push bx
mov bx, cx
mov es:[bx], ax ;вывод символа
pop bx
add cx, 2 ;смещаем на следующий символ указатель на символ в видеопамяти
inc bx ;увеличиваем номер позиции курсора
jmp again;бесконечный цикл с выходом по ESC
go:
.exit 0
end
Че с ним нетак?=( я его транслирую линкую и программа просто висит а не работает:(