在汇编中扭曲光标

时间:2013-07-18 21:01:32

标签: assembly x86 bios vga

使用BIOS视频中断,我终于可以在屏幕上移动光标,但当它到达屏幕的末尾时,它会消失。我需要它出现在另一边,我的意思是如果它直接到骑行侧它将出现在屏幕的左侧。有人可以告诉我如何做到这一点?

  .MODEL SMALL
  .STACK 1000h
  .DATA

  ROW DB 12 ; initial cursor position
  COL DB 40

 .CODE
 .STARTUP
START :
  MOV AH, 0     ; set video mode
  MOV AL, 3     ; 80x25 color
  INT 10H           ; video BIOS call   
  MOV AH, 2     ; set cursor position
  MOV BH, 0     ; display page number
  MOV DH, 24        ; set bottom row number
  MOV DL, 7     ; column number
  INT 10H           ; video BIOS call
  MOV AH,2        ;set cursor position
 MOV BH,0        ;display page number
 MOV DH,ROW      ;row number
 MOV DL,COL      ;column number
 INT 10H         ;video BIOS call
 MOV BL, 15
 INT 10H         ;video BIOS call

READ :
MOV AH, 0       ;read keyboard
INT 16h           ;BIOS call
CMP AL,0
JZ CSC
CMP AL,'q'
JMP EXIT

CSC :
CMP   AH,72        
JZ   UP
CMP   AH,80       
JZ   DOWN
CMP   AH,75       
JZ   LEFT
CMP   AH,77        
JZ   RIGHT

 UP:
SUB ROW, 1
MOV   AH,2          ;set cursor position
MOV   BH,0          ;display page number
MOV   DH,ROW        ;row number
MOV   DL,COL        ;column number
INT   10H           ;video BIOS call
JMP READ      

 DOWN:
ADD   ROW, 1
MOV   AH,2          ;set cursor position
MOV   BH,0          ;display page number
MOV   DH,ROW        ;row number
MOV   DL,COL        ;column number
INT   10H           ;video BIOS call
JMP   READ   

 RIGHT:
ADD   COL, 1
MOV   AH,2          ;set cursor position
MOV   BH,0          ;display page number
MOV   DH,ROW        ;row number
MOV   DL,COL        ;column number
INT   10H           ;video BIOS call
JMP   READ   

LEFT:
SUB   COL, 1
MOV   AH,2          ;set cursor position
MOV   BH,0          ;display page number
MOV   DH,ROW        ;row number
MOV   DL,COL        ;column number
INT   10H           ;video BIOS call
JMP   READ      
EXIT : .EXIT 
END

1 个答案:

答案 0 :(得分:1)

您只需在更改位置时添加一个检查,以确保它没有移出边缘。如果有,则将位置设置为屏幕的另一侧。

例如,当向左移动时,您可以执行以下操作:

LEFT:
SUB   COL, 1
CMP   COL, 0
JGE   LEFTOK:
MOV   COL, 79
LEFTOK:

从列位置减去1。然后你检查它是否大于或等于0.如果是,你没问题。如果没有,则将列位置设置为79(假设屏幕宽度为80个字符 - 您希望为此设置常量或查找该值)。

你可以为所有其他方向做同样的事情。

严格来说,您不需要上面示例中的CMP COL,0,因为SUB无论如何都会设置相应的标记,但我认为代码更清晰。