8086 汇编初学之贪吃蛇

前言

一直没想过要去学习汇编,觉得需要用汇编的场合无非三种:

  1. 与硬件结合很紧密高级语言做不到
  2. 时空效率要求甚高算法层面已不能优化到
  3. 逆向破解等只能用某些途径看其汇编指令
    其余情况下,用汇编无异于有炮不用偏用鸟枪。
    本来准备等自己需求以上场合时再去学,但因为学校举办的汇编比赛,计算机学院都要参加,也算是一个由头,于是开始了我的第一个汇编程序。

运行效果

代码只有 400 行,功能很简略,实现了最基本的游戏流程,看运行效果

概述

本质上用汇编去写一个贪吃蛇和用其他语言去实现没什么区别,不过是换一种方式表达,当然,是一种更加麻烦的方式。
以前用 c++ 实现过 C++ 贪吃蛇和 C++ 俄罗斯方块。所以对于这类小游戏,该怎么切是知道了,剩下的事就是找家伙了。www.biyezuopin.vip

要实现这类简易的小游戏,需要二点:
\1. 定时器
\2. 非阻塞接收按键
有上面两者便可以搞定一切。
但在汇编下,为这两点,耽搁了不少时间。不对,是三点,还有生成随机数(原本很容易的事都变得麻烦了起来)。

定时器

事实上,查了很多资料,但还是不知道怎样去实现定时器,所以这个需求只能变通的解决。
用空循环来控制时间。

非阻塞接受按键

getInput:mov al, 0mov ah, 1int 16h;查看键盘缓冲区是否有数据cmp ah, 1;ah为0表示有,否则没有je getInputEndmov al, 0mov ah, 0int 16h;从缓冲区读取数据;此时值已经在ax里了,做你想做的   getInputEnd:ret

随机数

mov ax, 0h;间隔定时器
out 43h, al;通过端口43h
in al, 40h;
in al, 40h;
in al, 40h;访问3次,保证随机性;如果对范围并不需要精确,可以直接与运算来获得,
;否则,用div取余
mov bl, 18
div bl mov al, ah
mov ah, 0;此时ax的值就是0~18的

代码

assume cs:code,ds:data,ss:stackdata segmentsfood dw 0sdct dw 0sbody dw 400 dup(0)
data endsstack segmentdw 20 dup(0)
stack endscode segmentstart:mov ax, datamov ds, axmov ax, stackmov ss, axmov sp, 20mov ax, 0b800hmov es, axmov si, 4 ;保存数据段偏移量mov cx, 4;初始蛇长度mov ax, 0A04hs:;初始化蛇mov ds:[si], axadd si, 2inc alloop smov ax, 4d00h;向右mov ds:[2], ax;初始化方向call clearBg;清屏call outBg;输出地图边框call outBody;输出蛇call creatFood;输出食物mov cx, 30Game:push cxcall updateBodymov cx, 0Fhaaaa1:push cxmov cx, 0FFFhbbbb:push cxcall getInputpop cxloop bbbbpop cxloop aaaa1;jmp GameEndjmp GameGameEnd:    ;退出;call outBodymov ax, 4c00hint 21hupdateBody:mov ax, ds:[2]mov di, sisub di, 2cmp ax, 4800hje shangmov ax, ds:[2]cmp ax, 5000hje xiamov ax, ds:[2]cmp ax, 4b00hje zuomov ax, ds:[2]cmp ax, 4d00hje youshang:mov ax, ds:[di]sub ah, 1jmp checkBodyxia:mov ax, ds:[di]add ah, 1jmp checkBodyzuo:mov ax, ds:[di]sub al, 1jmp checkBodyyou:mov ax, ds:[di]add al, 1;mov ds:[di], axjmp checkBodycheckBody:push ax;判断蛇头是否碰到地图边界cmp ah, 0je GameEndcmp ah, 20je GameEndcmp al, 0je GameEndcmp al, 20je GameEnd;判断蛇头是否碰到蛇身mov cx, sisub cx, 6mov di, 4s0: mov bx, ds:[di]cmp bx, axje GameEndadd di, 2sub cx, 1loop s0pop ax;判断蛇头是否吃到食物mov bx, ds:[0]cmp ax, bxje addBodyjmp updateStartupdateStart:mov cx, sisub cx, 6mov di, 4push axmov dl, ' ';字符mov dh, 0;颜色mov bx, ds:[di]call outStrs5: mov dx, ds:[di+2]mov ds:[di], dxadd di, 2sub cx, 1loop s5mov dl, ' ';字符mov dh, 71h;颜色mov bx, ds:[di]call outStrpop axmov ds:[di], axmov dl, ' ';字符mov dh, 44h;颜色mov bx, ds:[di]call outStrupdateEnd:retaddBody:mov dl, ' ';字符mov dh, 71h;颜色mov bx, ds:[di]call outStrmov ax, ds:[0]mov ds:[si], axmov dl, ' ';字符mov dh, 44h;颜色mov bx, ds:[si]call outStradd si, 2call creatFoodjmp updateEndgetInput:;获取键盘输入mov al, 0mov ah, 1int 16h;接收键盘cmp ah, 1je getInputEndmov al, 0mov ah, 0int 16h;mov cx, ax;键盘值在ax;判断输入cmp cx, 4800hje gshangcmp cx, 5000hje gxiacmp cx, 4b00hje gzuocmp cx, 4d00hje gyoujmp getInputEndgshang:mov ax, ds:[2]cmp ax, 5000hje getInputEndjmp fxgxia:mov ax, ds:[2]cmp ax, 4800hje getInputEndjmp fxgzuo:mov ax, ds:[2]cmp ax, 4d00hje getInputEndjmp fxgyou:mov ax, ds:[2]cmp ax, 4b00hje getInputEndjmp fxfx:;更改方向标志mov ds:[2], cxgetInputEnd:ret;结束outBody:mov cx, sisub cx, 6mov di, 4s1: mov ax, ds:[di]mov dl, ' ';字符mov dh, 71h;颜色mov bl, al;列mov bh, ah;行call outStradd di, 2sub cx, 1loop s1mov dl, ' 'mov dh, 44hmov ax, ds:[di]mov bl, almov bh, ahcall outStrretoutBg:mov dl, ' ';字符mov dh, 71h;颜色mov bl, 0;列mov bh, 0;行mov cx, 20row:push cxpush bxcall outStr;上边界pop bxpush bxadd bh, 20call outStr;下边界pop bxinc bl;列加1pop cxloop rowmov bl, 0;mov bh, 0;mov cx, 21col:push cxpush bxcall outStr;左边界pop bxpush bxadd bl, 20call outStr;右边界pop bxinc bh;行加1pop cxloop colretoutStr: ;在指定位置输出字符mov al, 80mul bh;行乘以80mov bh, 0add bl, bl;add ax, bx;加上列即为偏移量push simov si, axadd si, simov es:[si], dlmov es:[si+1], dhmov es:[si+2], dlmov es:[si+3], dhpop siretcreatFood:;生成食物call getFoodPositionmov dl, ' 'mov dh, 071hmov bx, ds:[0]call outStrretgetFoodPosition:;获取食物位置f1: call getRandmov ds:[0], alcall getRandmov ds:[1], almov cx, sisub cx, 4mov di, 4s11: mov ax, ds:[di]cmp ax, ds:[0]je f1add di, 2sub cx, 1loop s11retgetRand:;获取随机数 范围1~19mov ax, 0h;间隔定时器out 43h, al;通过端口43hin al, 40h;in al, 40h;in al, 40h;访问3次,保证随机性mov bl, 18div bl mov al, ahmov ah, 0inc alretclearBg:    ;清屏mov ax, 3hint 10hretcode endsend start

mov di, 4
s11:
mov ax, ds:[di]

        cmp ax, ds:[0]je f1add di, 2sub cx, 1loop s11ret

getRand:;获取随机数 范围1~19

mov ax, 0h;间隔定时器
out 43h, al;通过端口43h
in al, 40h;
in al, 40h;
in al, 40h;访问3次,保证随机性mov bl, 18
div bl mov al, ah
mov ah, 0inc alret

clearBg: ;清屏
mov ax, 3h
int 10h
ret

code ends

end start

基于汇编语言实现的贪吃蛇游戏设计相关推荐

  1. java毕业设计——基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码)——贪吃蛇游戏

    基于java+J2ME的贪吃蛇游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的贪吃蛇游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦.需要下载开题报告P ...

  2. 基于51单片机的贪吃蛇游戏设计

    1绪 论 1.1本课题研究的背景及意义 随着当今社会的发展,人们的生活节奏变得越来越快,人们开始逐渐的融入全球化的世界.人们已经不再局限于一小块天地,加班,出差已经占据了现代人生活的绝大部分.这个时候 ...

  3. 基于verilog贪吃蛇游戏设计

    概述 基于verilog贪吃蛇游戏设计.使用verilog语言 小游戏主要分为以下几个模块:顶层模块.VGA显示模块.蛇身控制模块.苹果控制模块. 系统主要分为顶层模块.VGA显示模块.蛇身控制模块. ...

  4. c语言贪吃蛇游戏的论文,基于c语言的贪吃蛇游戏论文.doc

    基于c语言的贪吃蛇游戏论文 第 PAGE \* Arabic \* MERGEFORMAT 15 页第 PAGE \* Arabic \* MERGEFORMAT 15 页 学校代码 学号 分 类 号 ...

  5. 【STM32单片机】贪吃蛇游戏设计

    文章目录 一.主要功能 二.硬件资源 1.硬件准备 2.硬件连接 四.软件设计 1.软件结构 2.主要代码 五.实验现象 联系作者 一.主要功能 系统运行后,TFTLCD触摸屏显示游戏界面,通过按键任 ...

  6. 字符版本贪吃蛇游戏设计及算法

    字符版本贪吃蛇游戏设计及算法 贪吃蛇,是一款经典的益智游戏.我们可以通过算法捕捉和传递智能,设计出能自动跑着吃食物的智能蛇. 有不少人对此研究,设计出了很棒的算法,如图: 归纳一些比较高级的算法为三类 ...

  7. 基于linux的贪吃蛇游戏设计_贪吃蛇还能这么玩?绝对是你从未体验过的全新版本(上)...

    上个月 Gitee 宣布推出「Python 贪吃蛇魔改大赛」的活动,受到了众多开发者们的欢迎.半个多月后,我们收到了共计 42 个参赛作品,有的作品创意无限,有的作品视觉效果极佳,看看下面的作品一览, ...

  8. 贪吃蛇游戏设计准备(实验准备)

    一.实验目的 1)实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右 控制"蛇"的移动,吃到"豆子"以后"蛇& ...

  9. 使用C语言gtk编程一个贪吃蛇游戏设计与实现

    使用C语言以及gtk编程设计一个贪吃蛇游戏. 功能需求: (1)窗口界面设计:创建各种窗口和按钮标签等: (2)小蛇移动控制:按键盘上的上下左右键控制小蛇上下左右移动: (3)游戏进程控制:若小蛇碰到 ...

最新文章

  1. 视觉三维重建的关键技术及实现思路汇总
  2. iOS:自己写的一个星级评价的小Demo
  3. CentOS安装高版本gcc
  4. python拆分列表元素_Python将列表拆分为一个元素 - python
  5. Ext.form.TextArea文本区
  6. 认证拦截功能需求分析
  7. 序列化的高阶认识-简单认识一下 Java 原生序列化
  8. 数据重塑_人工智能能否重塑全球力量平衡?
  9. 中国石油大学(华东)计算机/软件考研经验分享
  10. linux打开文件脚本,linux脚本文件实现的功能有哪些剧本用工具打开
  11. vue 简单实现组件自动注册
  12. 隆中对,程序员修炼之道,技术学习前进之路
  13. 千锋逆战1903班Days13上课代码以及笔记
  14. 惯性动作捕捉之工业设计
  15. oracle数据库数据传输
  16. 【图像插值】基于matlab稀疏拉普拉斯滤波器图像插值【含Matlab源码 2055期】
  17. Internet技巧两则
  18. 深入hotstuff与pbft协议的核心
  19. Coding and Paper Letter(四十五)
  20. php 使用guzzle发送异步的HTTP请求

热门文章

  1. The last packet sent successfully to the server was 0 milliseconds ago 解决
  2. C#SharpDevelop如何开发插件详细记录
  3. 73939133——“我穿越了无数条世界线,却看不到我要的未来”
  4. 【深入浅出IOS开发】设置图片水印
  5. 实时车道线检测和智能告警 | 车距 + 弯道 + 车道线
  6. redis的多路复用原理
  7. 笔记本式计算机处理器,问答:笔记本电脑如何选择处理器
  8. 路何去何从-第三方Oracle服务商
  9. 如果要用运营的姿势,发支付宝红包
  10. 机器学习-朴素贝叶斯-垃圾邮件