CSDN博客

img happyjyr

一个字符图形程序

发表于2004/7/11 20:13:00  1768人阅读

分类: 我的程序

  

  这个是学完汇编后,做的第一个小程序.程序很小,当时却对此颇为满意.自认为是自己做的第一个成型的程序.为缅怀那份得意的心情,先把这个勉为其难称为程序的程序放在这:).

  简介:制作图形元素表,表中将所需的各种字符图形编上号码,并用存储器映射法将其显示在屏幕的左上部分。将光标定位在屏幕的右半部分画图区。上、下、左、右光标控制键控制光标在四个方向上移动,不显示其轨迹同时要控制光标位置不超出画图区的边界。当按动某一数字键时,在光标位置处显示出相应编号的字符图形,然后移动光标,再显示一个字符图形,最后绘制出一幅由字符组成的图形。按动ESCape键,退出程序,返回DOS

 

data  segment

buffer  db   200 dup(?)                                            

db1   db   1

db2   db   0

db3   db   00h

msg1 db 'THE TABLE:  THE DRAWING AREA:(press "esc" key to exit)','$'

data ends

program  segment

main      proc    far

        assume cs:program,ds:data 

start:

     push ds

     sub ax,ax

     push ax

mov ax,data

mov ds,ax

 

     mov ah,09

lea dx,msg1               ;显示信息

int 21h 

                         

mov bx,26

     mov db1,0                ;显示分界线

     mov db2,36

op:

     mov ah,2

     mov bh,0  

     mov dh,db1              ;初始化光标

     mov dl,db2

     int 10h

mov bh,0

     mov cx,1

     mov al,2ah

     mov ah,0ah

     int 10h

     inc db1

     dec bx

     jnz op

 mov db1,1

     mov db2,0

     mov si,0

op1:                          ;制作图形元素表

     mov ah,2

     mov bh,0  

     mov dh,db1                   ;定位光标

     mov dl,db2

     int 10h

 

     mov al,db3

     mov buffer[si],al               ;显示数字并存入ASCII

     push si

     add si,30h

     mov bh,0

     mov ax,si

     and ax,00ffh

     mov cx,1

     mov ah,0ah

     int 10h

    

     inc db2

     cmp db2,39                   ;判断是否过界

     jna  op2

     inc  db1

     mov db2,0

 

op2:  mov ah,2

     mov bh,0  

     mov dh,db1                   ;重定位光标

     mov dl,db2

     int 10h

    

     mov ah,0ah     

     mov bh,0                     ;显示字符

 

     mov al,db3

     mov cx,1

     int 10h

 

     pop si

     inc si

     inc db3

     cmp db3,09h

     ja over

add db2,7                   

  cmp db2,39              ;判断是否过界

     jna  op1

     inc  db1

      mov db2,0

     jmp op1

over:       

   mov db1,1

   mov db2,38

 

   mov ah,2

   mov bh,0  

   mov dh,1

   mov dl,38                ;初始化光标

   int 10h

  

opp0: 

  mov ah,0

  int 16h                   ;判断输入键

  cmp ah,48h               ;方向键

  je up                  

  cmp ah,50h

  je down

  cmp ah,4dh

  je right

  cmp ah,4bh

  je left

  cmp ah,01h                ESC

 

  jnz rr

     ret

rr:  cmp al,30h              ;数字键

  jnb opp2

  jmp opp0

opp2:

  cmp al,39h

  ja  opp0

  and ax,00ffh

  sub ax,30h

  mov si,ax

  mov al,buffer[si]           ;显示相应字符

  mov bh,0

  mov cx,1

  mov ah,0ah

  int 10h

jmp opp0

up:

   dec db1

   jz  edg_up

   jmp opp1               ;定界线

edg_up:

   mov db1,1

   jmp opp1

down:

   inc db1

   cmp db1,24

   ja  edg_down

   jmp opp1

edg_down:

   mov db1,24

   jmp opp1

right:

   inc db2

   cmp db2,78

   ja edg_right

   jmp opp1

edg_right:

   mov db2,78

   jmp opp1

left:

   dec db2

   cmp db2,38

   jb  edg_left

   jmp opp1

edg_left:

   mov db2,38

opp1:  

   mov ah,2

   mov bh,0                ;重定位光标

   mov dh,db1

   mov dl,db2

   int 10h

   jmp opp0

exit:

   ret                      ;返回DOS

main endp

program  ends

   end start

 

0 0

相关博文

我的热门文章

img
取 消
img