汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-07-24 12:20] 练习:一个实时显示光标位置的小程序

图片载入中
这几天在学习bios的10h和16h中断方面的知识。 作为一个总结, 编写了这个程序。这个简单的程序就是一个光标只能在屏幕中间的窗口里任意游动, 并实时的显示光标位置。就这么简单。呵呵。程序运行在全屏dos模式比较好。
;----------------------------------------------------
     1        ;Move direction key,Realtime display cursor position
     2        ;filename:G.asm
     3        assume        cs:code,ds:data,ss:stack
     4        data        segment
     5        msg1        db        'Move cursor',0
     6        msg2        db        'Writed by Masmaster',0
     7        msg3        db        'Press Q return DOS',0
     8        data        ends
     9        code        segment
    10        stack        segment stack
    11                dw        128 dup (0)
    12        stack        ends
    13        start:
    14                mov ax,stack
    15                mov ss,ax
    16                mov sp,256
    17                mov ax,data
    18                mov ds,ax
    19        ;
    20        ;protec all general registers
    21                push ax
    22                push bx
    23                push cx
    24                push dx
    25                push si
    26                push di
    27                push bp
    28                push sp
    29        ;
    30        ;creat a window area
    31                mov ah,6        
    32                mov bh,0f2h                ;backgrand color
    33                mov cx,0819h                ;start coor:row:8,col:25
    34                mov dx,1335h                ;end coor  :row:19,col:53
    35                int 10h
    36        ;
    37        ;hide cursor
    38                mov ah,1
    39                mov cx,0100h
    40                int 10h
    41        ;
    42        ;print hint message
    43                mov si,offset msg1
    44                mov dl,25
    45        p1:        
    46                mov ah,2
    47                mov dh,7
    48                mov bh,0
    49                int 10h
    50                mov ah,9
    51                mov al,[si]
    52                mov bl,0fh
    53                mov cx,1
    54                int 10h
    55                inc si
    56                inc dl
    57                cmp al,0
    58                jnz p1
    59                mov si,offset msg2
    60                mov dl,35
    61        p2:        
    62                mov ah,2
    63                mov dh,20
    64                mov bh,0
    65                int 10h
    66                mov ah,9
    67                mov al,[si]
    68                mov bl,0fh
    69                mov cx,1
    70                int 10h
    71                inc si
    72                inc dl
    73                cmp al,0
    74                jnz p2
    75        ;
    76        ;check keybuffer
    77        ck:        mov ah,11h
    78                int 16h
    79                jz ck
    80                mov si,offset msg3
    81                mov dl,25
    82        p3:        
    83                mov ah,2
    84                mov dh,7
    85                mov bh,0
    86                int 10h
    87                mov ah,9
    88                mov al,[si]
    89                mov bl,0fh
    90                mov cx,1
    91                int 10h
    92                inc si
    93                inc dl
    94                cmp al,0
    95                jnz p3
    96        ;
    97        ;put a char onto window
    98                mov ah,2
    99                mov dh,13
   100                mov dl,40
   101                mov bh,0
   102                int 10h
   103                mov ax,0a20h        
   104                mov cx,1
   105                int 10h
   106        ;
   107        ;main fram,control cursor
   108        main:
   109                in al,60h
   110                cmp al,10h                ;press Q,quit
   111                jz over
   112                mov ah,0                ;monitor keyboard buffer
   113                int 16h
   114                cmp ax,4800h                ;up direction
   115                jz up
   116                cmp ax,5000h                ;down direction
   117                jz down
   118                cmp ax,4b00h                ;left direction
   119                jz left
   120                cmp ax,4d00h                ;right direction
   121                jz right
   122                jmp main                ;
   123        up:        
   124                call coor
   125                mov ax,0a20h
   126                mov cx,1
   127                int 10h
   128                mov ah,3
   129                int 10h
   130                dec dh
   131                cmp dh,7
   132                jz down
   133                mov ah,2
   134                int 10h
   135                mov ax,0a1eh
   136                mov cx,1
   137                int 10h
   138                jmp main
   139        down:        
   140                call coor
   141                mov ax,0a20h
   142                mov cx,1
   143                int 10h
   144                mov ah,3
   145                int 10h
   146                inc dh
   147                cmp dh,20
   148                jz up
   149                mov ah,2
   150                int 10h
   151                mov ax,0a1fh
   152                mov cx,1
   153                int 10h
   154                jmp main
   155        left:        
   156                call coor
   157                mov ax,0a20h
   158                mov cx,1
   159                int 10h
   160                mov ah,3
   161                int 10h
   162                dec dl
   163                cmp dl,24
   164                jz right
   165                mov ah,2
   166                int 10h
   167                mov ax,0a11h
   168                mov cx,1
   169                int 10h
   170                jmp main
   171        right:        
   172                call coor        
   173                mov ax,0a20h
   174                mov cx,1
   175                int 10h
   176                mov ah,3
   177                int 10h
   178                inc dl
   179                cmp dl,54
   180                jz left
   181                mov ah,2
   182                int 10h
   183                mov ax,0a10h
   184                mov cx,1
   185                int 10h
   186                jmp main
   187        ;
   188        over:        mov ax,0a20h
   189                mov cx,1
   190                int 10h
   191                call clear
   192        ;restore all general registers
   193                pop sp
   194                pop bp
   195                pop di
   196                pop si
   197                pop dx
   198                pop cx
   199                pop bx
   200                pop ax
   201        ;
   202        ;retuen dos
   203                mov ah,4ch
   204                int 21h
   205        ;
   206        ;sub-proc,display cursor position
   207        coor        proc uses ax bx dx di 
   208                mov ax,0b800h
   209                mov es,ax
   210                mov bl,10
   211                mov di,160*7+49*2        ;row:7,col:49
   212                push dx
   213                mov al,dh
   214                and ax,0ffh
   215                div bl
   216                or ax,3030h
   217                mov es:[di],al
   218                mov es:[di+2],ah
   219                mov al,':'
   220                mov es:[di+4],al
   221                pop dx
   222                mov al,dl
   223                and ax,0ffh
   224                div bl
   225                or ax,3030h
   226                mov es:[di+6],al
   227                mov es:[di+8],ah
   228                ret
   229        coor        endp
   230        ;
   231        ;clear
   232        clear        proc
   233                mov ah,1
   234                mov cx,0607h
   235                int 10h
   236                mov ax,600h
   237                mov cx,0
   238                mov dx,184fh
   239                int 10h
   240                mov ah,2
   241                mov dx,0
   242                int 10h
   243                ret
   244        clear        endp
   245        code        ends
   246        end        start
;----------------------------------------------------
评论次数(4)  |  浏览次数(420)  |  类型(程序与练习) |  收藏此文  | 

[  avalon   发表于  2010-07-26 14:46  ]

漂漂哇。。

注意到一个事,你程序的最左边都有行号,用的是VIM吗?

[  masmaster   发表于  2010-07-26 15:05  ]

嗯, 是呀!

[  avalon   发表于  2010-07-26 16:33  ]

嘿嘿嘿,能把你的.vimrc发给我么,谢谢哇

[  avalon   发表于  2010-07-26 16:34  ]

33921140(at)qq(dot)com

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码