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

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  何以解忧愁,唯有杜康酒!
  • 『姓名』:
  • 『性别』:男『发送消息
  • 个人说明:http://student.zjzk.cn/course_ware/data_structure/web/shu/shu6.3.2.htm
  • 详细信息『加为好友』
学习动态

[2010-07-17 10:29] 推荐博文 在屏幕上显示笑脸,显示坐标依次递增(或递减),碰到屏幕则弹起

assume cs:code
code segment
       dec dh
       dec dl
       inc dh
       inc dl        ;预存指令
start: mov ax,cs
       mov ds,ax      
       mov si,0
       lea di,s1     ;使ds:si指向预存指令,ds:di指向目的地址
       mov dx,0h     ;光标起始坐标0,0
     s:mov ah,2
       mov bh,0
       int 10h       ;调用int 10h第2号中断,置光标
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
       mov ah,0ah     ;int 10h第0a号中断
       mov al,2       ;显示笑脸
       mov bh,0        ;第0页
       mov cx,1       ;重复次数1
       int 10h
       call delay     ;延迟显示
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       mov ah,0ah      ;用int 10h  0a号中断清除笑脸
       mov al,0
       mov bh,0
       int 10h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    
       cmp dh,24       ;行号是否为24
       jb L             ;小于则转 L
       mov ax,[si]     ;等于则改s1处为自减
       mov [di],ax     
    L2:cmp dl,79       ;列号是否为79
       jb L1           ;小于则转 L1
       mov ax,[si+2]    ;等于,改si+2处为自减
       mov [di+2],ax
       jmp s1            
     L:cmp dh,0         ;行号是否为0
       ja L2             ;大于0转L2
       mov ax,[si+4]     ;为0 ,改s1处为自加
       mov [di],ax
       jmp L2
    L1:cmp dl,0         ;列号是否为0
       ja s1            ;大于转 s1
       mov ax,[si+6]    ;等于改 s1+2处 自加
       mov [di+2],ax
    s1:inc dh
       inc dl 
       jmp s  
       mov ax,4c00h
       int 21h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
 delay:push ax
       push dx
       mov dx,2000h
       mov ax,0
   s3: sub ax,1
       sbb dx,0
       cmp ax,0
       jne s3
       cmp dx,0
       jne s3
       pop dx
       pop ax
       ret 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>       
 code ends
 end start
评论次数(64)  |  浏览次数(77305)  |  类型(我的程序) |  收藏此文  | 

[  masmaster   发表于  2010-07-17 15:36  ]

在call delay后加入如下代码
in al,60H
cmp al,10H
jz over
在mov ax,4c00H前加入标号over
试一试吧

[  masmaster   发表于  2010-07-17 15:37  ]

意思就是读键盘端口, 如果有字符读到, 跟10H(Q键)比。

[  zhengcong3250   发表于  2010-07-18 22:39  ]

哈哈,谢谢,可以退出了,我也这么想的,可就是不知道加在那里,还有就是那部分条件跳转,有点晕,还是我自己画了个流程图才整好的,就这样也很费时啊,好像是每个跳转要有顺序一样

[  znxllyuan   发表于  2010-12-15 20:02  ]

根据圣凡哥的思想改完 很有意思呢、
assume cs:code 
code segment 
       dec dh 
       dec dl 
       inc dh 
       inc dl        ;预存指令 
start: mov ax,cs 
       mov ds,ax       
       mov si,0 
       lea di,s1     ;使ds:si指向预存指令,ds:di指向目的地址 
       mov dx,0h     ;光标起始坐标0,0 
     s:mov ah,2 
       mov bh,0 
       int 10h       ;调用int 10h第2号中断,置光标 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
       mov ah,0ah     ;int 10h第0a号中断 
       mov al,2       ;显示笑脸 
       mov bh,0        ;第0页 
       mov cx,1       ;重复次数1 
       int 10h 
       call delay     ;延迟显示 
       in al,60H 
       cmp al,10H 
       jz over 

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
       mov ah,0ah      ;用int 10h  0a号中断清除笑脸 
       mov al,0 
       mov bh,0 
       int 10h 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     
       cmp dh,24       ;行号是否为24 
       jb L             ;小于则转 L 
       mov ax,[si]     ;等于则改s1处为自减 
       mov [di],ax      
    L2:cmp dl,79       ;列号是否为79 
       jb L1           ;小于则转 L1 
       mov ax,[si+2]    ;等于,改si+2处为自减 
       mov [di+2],ax 
       jmp s1             
     L:cmp dh,0         ;行号是否为0 
       ja L2             ;大于0转L2 
       mov ax,[si+4]     ;为0 ,改s1处为自加 
       mov [di],ax 
       jmp L2 
    L1:cmp dl,0         ;列号是否为0 
       ja s1            ;大于转 s1 
       mov ax,[si+6]    ;等于改 s1+2处 自加 
       mov [di+2],ax 
    s1:inc dh 
       inc dl  
       jmp s   
 over:  mov ax,4c00h 
       int 21h 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
 delay:push ax 
       push dx 
       mov dx,500h 
       mov ax,0 
   s3: sub ax,1 
       sbb dx,0 
       cmp ax,0 
       jne s3 
       cmp dx,0 
       jne s3 
       pop dx 
       pop ax 
       ret  
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>        
 code ends 
 end start

[  powerlandy   发表于  2010-12-28 22:06  ]

运行过了,神奇

[  游客   发表于  2011-05-29 16:47  ]

11

[  游客   发表于  2011-06-02 22:58  ]

好像NASM不能汇编,

[  lfszyxd   发表于  2011-06-05 15:19  ]

这个可以把笑脸定义在变量中么

[  flf583   发表于  2011-08-01 21:52  ]

这个好啊  直接用masm5.0就可以编译了

[  游客   发表于  2011-08-15 09:28  ]

强,学习中

[  liuxxpirate   发表于  2011-08-31 20:33  ]

刚学汇编呢,  程序在什么平台上运行呢。DOS 么 ,高手指指路啊。

[  chinatree   发表于  2011-09-01 01:19  ]

xp也可以。

[  wangjun126   发表于  2011-10-23 10:22  ]

嗯嗯 好好学习

[  flexman   发表于  2011-11-07 22:02  ]

用emu8086的表示不能程序正确运行。

[  yzl1079004146   发表于  2011-11-10 20:17  ]

新手,请多指点,谢谢

[  游客   发表于  2011-11-22 08:52  ]

emu8086可以运行了。不过delay 那段貌似不能跳出循环。

[  315198986   发表于  2011-11-22 22:18  ]

delay段s3的循环有问题

[  chinatree   发表于  2011-11-23 11:30  ]

楼上的别乱说,你先运行下拿出证据好吗?要看清楚,一个是sub另一个是sbb。区别大了去了。

[  游客   发表于  2011-12-07 09:55  ]

masm5.0也说不能编译啊!!!请高手指点下!!!
error A2009:Symbol not defined:SL

[  sunnysong14   发表于  2011-12-07 09:57  ]

masm5.0也说不能编译啊!!!请高手指点下!!! 
error A2009:Symbol not defined:SL

[  mywiil   发表于  2011-12-29 16:52  ]

没有SL,博主和5楼兄弟的代码都能编译OK,也正确运行。
我用masm5.0的,你不会是动了代码,把s1写成了sl吧?

[  dsk23d   发表于  2012-01-30 12:03  ]

那位大侠分析下S3的功能行吗,详细一些,好让我们这些莱鸟更深入了解一点.

[  chinatree   发表于  2012-01-30 12:38  ]

那个是延时函数,检测dx:ax啥时候为0就结束循环。不为0就ax减1,主要是sbb带借位减法,这样能把dx:ax当成1个整体。

[  dsk23d   发表于  2012-02-01 12:04  ]

谢谢回复,但延时有什么好处呢,是延时多少秒吗

[  chinatree   发表于  2012-02-01 12:49  ]

对,但是是延时多少毫秒。因为计算机速度很快,运行时会"一闪而过",延时的作用就是让我们能够看清楚。

[  游客   发表于  2012-02-14 10:47  ]

谢谢楼主,到今天终于看明白了。

[  游客   发表于  2012-03-28 06:22  ]

我才刚学的,照自己的思路也做了一个
大虾们帮忙加个按键返回(ESC)

assume cs:code
  code segment
  start:mov ax,0b800h                ;显存第一页
        mov ds,ax

        mov ax,0                ;默认AX为0
        mov si,1                ;si是行号1-25
        mov di,1                ;di是列号1-80

     c1:cmp si,1                ;si到1了说明该增加了,增加的信号是AH=0
        jne c2
        mov ah,0

     c2:cmp si,25                ;si到了25说明该减少了,减少的信号是AH=1
        jne c3
        mov ah,1

     c3:cmp di,1                ;DI到了1该增加了,增加的信号是AL=0
        jne c4
        mov al,0

     c4:cmp di,80                ;Di到了80说明该减少了,减少的信号是AL=1
        jne sh
        mov al,1

     sh:call show_smile                ;在DS:[BX]处显示ASCII为1的笑脸
        call time                ;延时召唤
        call clear_smile        ;擦脸:把笑脸用ASCII为32的空格盖掉

    ca1:cmp ax,0                ;依据AX的值判断SI,DI的增减
        jne ca2                        ;ax=0000,说明都该增加
        inc si                        ;ax=0001,说明DI不能增加了
        inc di                        ;ax=0100,说明SI不能增加了
        jmp c1                        ;ax=0101,说明SI,DI都不能增加了

    ca2:cmp ax,1                ;
        jne ca3
        inc si
        dec di
        jmp c1 

    ca3:cmp ax,100h                ;
        jne ca4
        dec si
        inc di
        jmp c1        

    ca4:cmp ax,101h                ;
        jne c1
        dec si
        dec di
        jmp c1

   over:mov ax,4c00h                ;谁帮忙加个按键,还没学到
        int 21h

show_smile:push ax                ;在DS:[BX]处显示一张脸
        push bx
        call bx_set                ;设置BX的值
        mov al,1
        mov [bx],al
        pop bx
        pop ax
        ret

clear_smile:push ax                ;用32(空格)擦脸
        push bx
        call bx_set                ;设置BX的值
        mov al,32
        mov [bx],al
        pop bx
        pop ax
        ret

   time:push ax                        ; SBB不会,借用一下
       push dx 
       mov dx,1000h 
       mov ax,0 
   s3: sub ax,1 
       sbb dx,0 
       cmp ax,0 
       jne s3 
       cmp dx,0 
       jne s3 
       pop dx 
       pop ax 

        ret

 bx_set:push ax                        ;BX=160*si+2*di-162
        push dx
        mov ax,160
        mul si
        mov bx,ax
        mov ax,2
        mul di
        add bx,ax
        sub bx,162
        pop dx
        pop ax
        ret

code ends
end start

[  游客   发表于  2012-03-28 06:25  ]

肿么楼上的运行还一卡一卡的

[  游客   发表于  2012-04-17 17:13  ]

I found this is an informative and interesting post so i think so it is very useful and knowledgeable. I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you <a href="http://www.tiffany-uk-sale.co.uk/tiffany-uk.html">tiffany uk</a> in the future as well. In fact your creative writing ability has inspired me. Really the article is spreading its wings rapidly.

[  游客   发表于  2012-04-17 17:13  ]

[url=http://www.tiffany-uk-sale.co.uk/tiffany-uk.html]tiffany uk[/url/]

[  escaping   发表于  2012-05-03 09:12  ]

好强大。。。第一次觉得汇编好神奇。。

[  azxs321   发表于  2012-05-09 22:57  ]

北京教育服务中心代 办 文 凭 认 证QQ492376088澳洲新加坡英国德国日本加大
 )

[  frzh   发表于  2012-06-02 09:24  ]

很强大

[  游客   发表于  2012-06-05 11:10  ]

能不能给一个流程图啊?,,,

[  游客   发表于  2012-06-05 11:11  ]

拜托了啊,,,我有急用啊,,,

[  842460904   发表于  2012-09-03 22:26  ]

真牛。

[  linqingjin   发表于  2013-07-15 17:36  ]

新手求给个软件地址。本人机子WIN764

[  游客   发表于  2013-10-19 00:12  ]

佩服佩服!!!谢谢分享!

[  kkll   发表于  2013-11-12 22:13  ]

好神奇  丫丫  刚开始学习汇编  今天第一次觉得汇编还是这么好玩  哇哇膜拜大神

[  游客   发表于  2013-12-04 06:42  ]

开始前加上清屏就更好了。

[  dgkepu   发表于  2013-12-06 06:57  ]

佩服佩服!!!谢谢分享!

[  dreamsever   发表于  2013-12-19 19:19  ]

大神,请问汇编语言可以编写或者调用窗口吗

[  游客   发表于  2014-02-20 21:21  ]

www.aibiancheng.cn 爱编程

[  游客   发表于  2015-06-07 16:23  ]

二〇一五年六月七日 16:23:17

[  qqqun238564439   发表于  2016-04-10 10:54  ]

厉害!

[  游客   发表于  2019-06-04 15:11  ]

你说你妈呢

[  runxsystem   发表于  2019-07-18 10:27  ]

smaile.asm:2: error: parser: instruction expected
smaile.asm:3: error: parser: instruction expected
smaile.asm:72: error: symbol `code' redefined
smaile.asm:72: error: parser: instruction expected
smaile.asm:73: error: parser: instruction expected

[  somniumchase   发表于  2021-01-01 11:40  ]

大佬NB,不知道为什么,我在dosbox里面运行,那个笑脸显示在左上角,而且还卡住了

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