前言

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

运行效果

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

概述

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

要实现这类简易的小游戏,需要二点:
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;通过端口43hin al, 40h;in al, 40h;in al, 40h;访问3次,保证随机性;如果对范围并不需要精确,可以直接与运算来获得,;否则,用div取余mov bl, 18div bl mov al, ahmov 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

8086汇编初学之贪吃蛇相关推荐

  1. 基于汇编实现的贪吃蛇游戏

    一 需求分析 现在有的一些人感觉生活都是很无聊的,所以有些时候肯定会玩各种各样的游戏的,有一些大的游戏,玩起来会话掉很多的时间,而且也会花掉大量精力的 ,所以在一些闲暇的时候一些小游戏会博得很多人的喜 ...

  2. 基于汇编语言实现的贪吃蛇游戏设计

    8086 汇编初学之贪吃蛇 前言 一直没想过要去学习汇编,觉得需要用汇编的场合无非三种: 与硬件结合很紧密高级语言做不到 时空效率要求甚高算法层面已不能优化到 逆向破解等只能用某些途径看其汇编指令 其 ...

  3. 8086汇编贪吃蛇(随机食物+速度递增)

    基于8086实现的贪吃蛇 [cpp] view plaincopy assume cs:code,ds:data data segment dw 200 dup(0)   ;--蛇身坐标 dw 0,0 ...

  4. 贪吃蛇——汇编综合性实验(含实验报告+源码)

    贪吃蛇--汇编综合性实验 完整的实验报告和源码见贪吃蛇--汇编综合性实验(含实验报告+源码) 实现效果 实验原理分析 (1)程序总体设计 贪吃蛇游戏我们并不陌生,简单来说就是一条小蛇通过吃在地图上随机 ...

  5. nasm汇编实现贪吃蛇

    title: nasm汇编实现贪吃蛇 date: 2019-12-20 18:43:10 文章目录 0. 前言 1. 需求分析 2. 数据结构设计 3. 程序流程架构 4. 难点分析 5. 具体实现 ...

  6. x8086千行汇编项目——汇编贪吃蛇、画图、两个程序的调度

    特别说明:本博客草稿创建于2018年12月5日(设为私密文章),这已经是作品提交截止日期以后,不过为了进一步避免不必要的麻烦将会在比赛彻底结束后发布为公开文章. 发布日期:2018/12/8 12:0 ...

  7. 汇编语言贪吃蛇、俄罗斯方块双任务设计实现详解(一)——整体系统设计

    题目要求: 1.系统划分:将显示器的屏幕划分成大小相等的左右两个显示窗口,并画出每个显示窗口的边框,窗口大小适中.若左窗口贪吃蛇游戏正在进行时,切换到右窗口执行俄罗斯方块,则贪吃蛇游戏暂停,以后每按一 ...

  8. IA32汇编语言 —— 贪吃蛇游戏

    这里分享一下我的汇编语言课程设计,贪吃蛇游戏 程序使用的资源不超过8086,可以用nasm编译成.com文件,运行在DOSBox环境中 效果演示 文章目录 一.简介 1. 游戏规则 2. 段寄存器安排 ...

  9. 再来一次的C语言贪吃蛇小游戏(一)

    0. 写在开头 学习编程也有两三年时间了,中间也玩(学校安排学习)过很多东西 ,从汇编到C到Java和python.用Java和Python也就图一快,真要体会编程乐趣还得看我C语言(开玩笑 ) 为什 ...

最新文章

  1. requests payload_python+Requests接口自动化测试之传递 URL 参数
  2. UNABLE to load uWSGI plugin: ./python_plugin.so: cannot open shared object file: No such file or dir
  3. python对话框代码_Python、tkinter、复杂对话框和代码结构
  4. 常用的JPA标记 (转)
  5. 玖云个人导航API工具网站源码
  6. 关于CentOS7虚拟机出现Failed to start LSB: Bring up/down的解决方法
  7. 【干货】后疫情时代,那些迎来爆发机会的产业.pdf(附下载链接)
  8. win10中cmd拒绝访问授权
  9. java怎么倒计时_详解java倒计时三种简单实现方式
  10. [Vue] Vue后台模板汇总
  11. css 文本和div垂直居中方法汇总
  12. Windows下DOS操作系统(cmd)详解
  13. 20201022-成信大-C语言程序设计-20201学期《C语言程序设计B》C-trainingExercises15
  14. 记录 网上搜集的自动获取银行卡信息工具类
  15. 主流安全大漏洞:隐私空间泄密
  16. java 获取某一天的起始时间
  17. UG/NX二次开发Siemens官方NXOPEN实例解析—1.6 BlockStyler/SelectionExample
  18. windows下kafka启动时系统找不到指定的路径(受害者亲测)
  19. 如何轻松搞定各种图形化展现
  20. 实验6 8255并行接口实验【微机原理】【实验】

热门文章

  1. 解决vscode开发小程序的标签识别问题
  2. MySQL 基于maxscale服务构建数据读写分离
  3. 目标检测YOLO实战应用案例100讲-基于轻量化神经网络的目标检测算法研究与应用
  4. 基于MINST数据集做分类的机器学习项目
  5. Android OpenCV(五十一):图像插值
  6. 天池:数据分析达人赛1:用户情感可视化分析
  7. 重庆理工大学两江校区计算机学院,重庆理工大学两江校区概况
  8. Ubuntu 20.04 开启root权限登陆、网卡配置
  9. 【C++】STL --- 概论和三大组件
  10. 浏览器打开控制台触发事件