当前位置:首页 > 电源 > 数字电源
[导读]因为8086混合8位和16位寄存器,所以经常需要将8位寄存器移出至临时寄存器,运算完以后再从临时寄存器移入8086寄存器。这些操作比较频繁,可以将其封装成函数。  指令的操

因为8086混合8位和16位寄存器,所以经常需要将8位寄存器移出至临时寄存器,运算完以后再从临时寄存器移入8086寄存器。这些操作比较频繁,可以将其封装成函数。

  指令的操作码决定了进行何种运算,指令还具有各种操作数。每条指令一般都有多种操作数类型。常见的8086指令类型如下。

  

 

  图 40 常见8086指令类型

  以加法指令add为例。

  add reg, reg类型。根据reg位宽不一样,可分成五类:16位的一种,低8位跟高8位两两组合形成四种。

  其余类型都是在reg,reg类型的基础上。遇到reg,mem类型,先计算出内存地址,再取出内存内容将其载入到辅助寄存器,接下来就是reg,reg类型的操作。mem,reg与reg,mem类似,只是运算方向相反,最后要将结果从寄存器写回内存。遇到立即数类型,则是将立即数载入寄存器再做运算。

  4.2.11.代码执行及转移分发器

  当一个基本块翻译完以后,经上下文切换后,由MIPS环境转入8086环境,开始执行已翻译的代码块。当执行至代码块末尾时,遇到跳转指令,然后转入转移分发器进行处理。转移分发器计算跳转目标地址(8086),以此地址在跳转缓存中寻找对应的MIPS地址。如果找到了,说明跳转目标是已翻译过的,那么继续跳过去执行。如果没找到,说明目标块还没有翻译,那么先执行翻译过程,再执行翻译块。

  4.3.系统库及应用程序详细设计方案

  4.3.1.系统可用资源及其分配

  系统可用内存空间有1MB的空间。内存地址空间的分配如下图:

  

 

  图 46 内存分配(1M)

  系统通过wishbone开源总线,与virtex-5硬件开发板自带的键盘、鼠标和串口等外设互联。键盘的硬件接口是PS/2标准,virtex-5支持16位色液晶显示器,串口用来与其他电脑主机连接,进行通信和数据传输。

端口类型

端口地址

rs232数据端口

20000000H

rs232忙位检测

20000004H

vga显示基址

50000000H

led

70000000H

键盘

90000000H

表 1 系统常用端口及其地址

  系统库函数设计与实现

  系统最初只支持MIPS汇编语言。用MIPS汇编语言开发出俄罗斯方块游戏。这个应用程序,不仅帮助找出了硬件系统存在的一些bug,如流水线CPU中存在的数据相关和控制相关问题,指令集的功能问题,而且还验证了硬件系统与RS232串口之间的数据传输功能的正确性,以及键盘接口和显示器接口的正确性和易用性。

  系统宏定义和端口常量

  系统的内存和外设的地址空间是连续分配的。为了提高开发应用程序的过程中的设备无关性和应用程序的通用性,我们把各个端口定义为常量,供系统库和应用程序参考使用。

  unsigned int* text_base = (int *)0x000C0000;

  unsigned int* graphics_base = (int *)0x50000000; //VGA 端口

  unsigned int* ps2_base = (int *)0x90000000; //ps2键盘 端口

  unsigned int* rs232_base = (int *)0xFFFFE000;

  unsigned int* rs232_busy = (int *)0xFFFFF000;

  unsigned int* font_base = (int *)0x000C12C0; //字库 端口

  表 2 系统端口常量定义

  系统的显示器支持16位色,即R5G5B6。为了保持应用程序开发的一致性,我们定义了一些供应用程序使用的颜色常量。

  #define COLOR_WHITE 0xFFFF

  #define COLOR_BLACK 0x0000

  #define COLOR_RED 0xF800

  #define COLOR_GREEN 0x07E0

  #define COLOR_BLUE 0x001F

  #define COLOR_BROWN 0xFC00

  #define COLOR_PURPLE 0x9009

  #define COLOR_YELLOW 0xFFE0

  #define COLOR_PINK 0xF81F

  图表 3 系统常用颜色常量定义

  键盘接口函数

  checkkey函数

  原型:int checkkey();

  功能:检查键盘是否有按键被按下

  说明:有键被按下返回 1,否则返回 0

  checkandgetkey函数

  原型:int checkandgetkey(int* key);

  功能:检查键盘是否有按键被按下,并得到按键的ASCII码

  说明:有键被按下返回 1,按键的ASCII由指针 key 保存;否则返回 0

  getchar函数

  原型:int getchar();

  功能:读键

  说明:从键盘上读取一个键,并返回该键的键值

  显示器接口函数

  putpixel函数

  原型:void putpixel(int x, int y, int color);

  功能:在屏幕的指定位置上画点

  说明: (x,y)为屏幕上点坐标,指定颜色 color

  getpixel函数

  原型:int getpixel(int x, int y);

  功能:返回屏幕上指定点的状态

  说明:(x,y)为屏幕上点的坐标,如果点为清除状态返回零,否则返回非零值

  printchar函数

  原型:void printchar(int x, int y, int ch, int color);

  功能:打印给定的字符

  说明: (x,y)为起点坐标,ch 为要打印的字符的ASCII码,指定字体颜色 font_color,背景颜色

  printword函数

  原型:void printword(int x, int y, int word, int color);

  功能:打印给定的字,调试时使用

  说明: (x,y)为起点坐标,word 为要打印的字即4个字节,先打印高字节,指定颜色 color

  printnum函数

  原型:void printnum(int x, int y, int num, int color);

  功能:打印给定的数字,调试时使用

  说明: (x,y)为起点坐标,num 为要打印的数字,指定字体颜色 font_color 背景色bkg_color,目前该函数只支持 0=

  line函数

  原型:void line(int x1,int y1,int x2,int y2, int color);

  功能:在屏幕上画直线

  说明: (x1,y1)为起点坐标,(x2,y2)为终点坐标

  circle函数

  原型:void circle(int x, int y, int radius, int color);

  功能:画圆框

  说明:x和y分别为圆心的横纵坐标,radius 为半径,color 为圆边框的颜色

  circlefilled函数

  原型:void circlefilled(int x, int y, int radius, int color)

  功能:画圆,并填充

  说明:x 和 y 分别为圆心的横纵坐标,radius 为半径,color 为圆边框以及填充的的颜色该函数还有待改进

  rectangle函数

  原型:void rectangle(int left, int top, int right, int bottom, int color);

  功能:在屏幕上画一矩形边框

  说明: (left,top)指定左上角坐标,(right,bottom)指定右下角坐标,指定边框颜色color

  串口接口函数

  rs232Check函数

  原型:int rs232Check()

  功能:检查rs232是否busy

  说明: return 返回值1为忙,0为空闲

  rs232ReceiveByte

  原型:char rs232ReceiveByte()

  功能:从rs232接收一个字节,轮询方式

  说明: return 返回一个字节

  rs232SendByte

  原型:void rs232SendByte(char b)

  功能:给rs232发送一个字节

  说明: param b 要发送的字节

  LED接口函数

  _lightLeds函数

  原型:void _lightLeds(int leds);

  功能:控制LED的显示

  说明:leds的低8位有效[!--empirenews.page--]

  4.3.2.应用程序设计与实现

  4.3.2.1.基于MIPS汇编语言的俄罗斯方块游戏设计

  开发环境:自己编写的MIPS汇编器AssemblerForRS-232.jar,MIPS汇编语言源文件in.asm,安装jre或jdk并配置好环境变量的windows XP及以上的操作系统。

  程序流程:

  

 

  图 47 俄罗斯方块程序流程图

  主要模块:

  start函数

  参数:无

  功能:游戏的主体框架,作用类似main函数

  说明:内部调用Tetris、tetris_clr、wait_key、start_enter等函数,构成整个游戏的主体框架。

  Tetris函数

  参数:无

  功能:游戏的逻辑控制主体

  说明:调用各种初始化函数、俄罗斯方块的生成函数和运动函数、玩家键盘控制函数、各种信息显示函数,实现游戏的所有逻辑。

  ini_boarder函数

  参数:无

  功能:画俄罗斯方块运行的左右边界

  说明:初始化游戏时使用

  set_bottom函数

  参数:无

  功能:画俄罗斯方块运行的下边界

  说明:初始化游戏时使用

  info函数类

  函数类:info_help、info_next、info_fail

  参数:无

  功能:显示各种信息

  说明:在初始化游戏界面时调用info_help显示帮助信息;调用info_next在屏幕左上角显示下一个即将下落的方块的形状和颜色,当游戏失败时调用info_fail提醒玩家。

  check_key函数

  参数:输出参数$v0和$v1

  功能:检查是否有键按下

  说明:键盘无键按下时$v0=0;否则$v0=1,$v1=键值

  chk_dlt函数

  参数:输出参数$v0

  功能:检查并删除满行

  说明:检测每一行是否已摆满方块,如果摆满则将其删除。返回值$v0为删除的满行数。

  detect_collision函数

  参数:输出参数$v0

  功能:检查是否有方块冲突

  说明:如果有冲突则返回$v0=2

  null_loop函数

  参数:输入参数$a0

  功能:空循环,用于延时

  说明:$a0=0,表示长延时;$a0=1表示短延时

  get_next_seq函数

  参数:输入参数$a3、输出参数$v0

  功能:根据当前方块的形状,得到下一个方块的形状

  说明:输入$a3当前形状的序列号,返回$v0下一个方块的形状的序列号

  draw_pic函数类

  函数类:pre_draw_pic类、un_pre_draw_pic类、draw_pic类

  参数:输入参数$a0和$a2

  功能:根据方块现在的位置和接下来的位置来画方块

  说明:输入参数$a0是当前位置,$a2是方块将要移动的位置

  4.3.2.2.基于C语言的吃豆子游戏设计

  开发环境:自己编写的硬件系统模拟器SimulatorForV5.jar,自己编写的内存填充工具MemoryFilling.jar,自己编写的硬件内存分配文件memory.bin,Gcc编译环境,严格的简单的C语言程序源文件user.c,安装jre或jdk并配置好环境变量的windows XP及以上的操作系统。

  程序流程:

  

 

  图 48吃豆子程序流程图

  主要模块:

  start_game函数

  原型:void start_game();

  功能:游戏程序的逻辑主函数

  说明:控制packman的运动,两个怪物的简单智能移动,检查游戏的终止条件,判断键盘输入并做相应的响应

  init_game函数

  原型:void init_game();

  功能:初始化游戏的全局变量

  说明:每次游戏重新开始时,需要调用该函数进行全局变量的初始化

  check_catch函数

  原型:int check_catch()

  功能:检测packman是否被怪物抓到

  说明:如果被抓到返回1,否则返回0

  check_collision函数

  原型:int check_collision()

  功能:检测两个怪物是否有冲突

  说明:如果有则返回1,否则返回0[!--empirenews.page--]

  clear_screen函数

  原型:void clear_screen(int color)

  功能:用指定颜色清屏

  说明:color为指定的颜色值,可以用宏定义的颜色值或者相应的16位数值

  draw函数类

  原型:void draw_map();void draw_info();void draw_ball(int x, int y);void draw_pea(int x, int y)

  功能:在指定坐标位置画形状

  说明:(x,y)为形状的左上角定点的坐标

  display函数类

  原型:int display_win();int display_lose();void display_bye()

  功能:全屏显示提示信息

  说明:分别提示玩家游戏成功、游戏失败、感谢信息

  get_direction函数类

  原型:int get_direction_1st();int get_direction_2nd()

  功能:随机得到怪物的下一次移动的方向

  说明:根据两个怪物位置的全局变量,简单的智能算法,计算两个怪物下一次移动的方向

  move函数类

  原型:void move_monster_1st();void move_monster_2nd ()

  功能:移动两个怪物

  说明:根据两个怪物的全局变量,计算后分别移动

  null_loop函数

  原型:void null_loop(int length)

  功能:空循环,用于延时

  说明:length参数为0时是长延时,为1时是短延时

  save_lattice函数

  原型:void save_lattice(int x, int y, int * array)

  功能:把指定位置方格的像素值保存在数组中

  说明:(x,y)为指定方格的坐标,array为全局数组变量

  resume_lattice函数

  原型:void resume_lattice(int x, int y, int * array)

  功能:把方格像素存储到指定的坐标

  说明:array为保存像素值的全局变量,(x,y)为要存放颜色的方格的坐标

  4.3.2.3.基于x86汇编语言的推箱子游戏设计

  开发环境: x86模拟器emu8086.exe,DOS模拟器DosBox.exe,x86汇编器NASM,windows XP及以上的操作系统。

  程序流程:

  

 

  图 49 推箱子程序流程图

  主要模块:

  init_game函数

  参数:无

  功能:游戏初始化

  说明:初始化游戏的界面和各个变量,每次重新进入游戏时调用该函数

  move_man函数

  参数:输入参数ax,bx

  功能:在指定的坐标处画man

  说明:ax为横坐标,bx为纵坐标

  move_box函数

  参数:输入参数ax,bx

  功能:在指定的坐标处画box

  说明:ax为横坐标,bx为纵坐标

  check_win函数

  参数:输出参数dx

  功能:检查箱子是否都放到指定位置

  说明:如果箱子已经摆放好返回dx=1,否则返回dx=0

  check_collision函数

  参数:输出参数dx

  功能:检查man和箱子是否能够移动

  说明:如果有冲突返回dx=1,否则返回dx=0

  check_key函数

  参数:输出参数ax,bx

  功能:检查是否有键按下

  说明:如果有键按下,ax=1,bx=键值;否则ax=0,bx无意义

  get_key函数

  参数:输出参数dx

  功能:等待键盘输入

  说明:键盘被按下后,返回键值dx=键值

  rectangle函数

  参数:输入参数arg0,arg1,arg2,arg3,arg4

  功能:画带颜色填充的长方形

  说明:参数通过堆栈传递,arg0=left,arg1=top,arg2=right,arg3=bottom,arg4=color,颜色采用R5G5B6的16位色

  xy2array函数

  参数:输入参数ax,bx,输出参数dx

  功能:将游戏中的x和y坐标对应到一位数组中

  说明:ax为横坐标,bx为纵坐标,返回dx

  draw_box函数

  参数:输入参数ax,bx,cx

  功能:在指定坐标处画box并用指定颜色填充

  说明:ax为横坐标,bx为纵坐标,cx指定颜色

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭