Показать сообщение отдельно

управление видеосистемой в текстовом режиме
  #1  
Старый 01.10.2009, 19:19
NorB
Познающий
Регистрация: 20.07.2007
Сообщений: 99
С нами: 9900206

Репутация: 25
По умолчанию управление видеосистемой в текстовом режиме

Есть задание :
Вывод символа с клавиатуры на позицию экрана, указанную курсором, с модификацией положения курсора.

Есть код:
Код:
.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
Че с ним нетак?=( я его транслирую линкую и программа просто висит а не работает
 
Ответить с цитированием