实验三 汇编语言程序设计(3)、接口实验.doc_第1页
实验三 汇编语言程序设计(3)、接口实验.doc_第2页
实验三 汇编语言程序设计(3)、接口实验.doc_第3页
实验三 汇编语言程序设计(3)、接口实验.doc_第4页
实验三 汇编语言程序设计(3)、接口实验.doc_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子工程系 无98班 991321 微机原理实验报告实验三 汇编语言程序设计(3)、接口实验(1)一、实验目的1进一步熟悉汇编语言程序的编程方法和技巧;2熟悉8253/8254定时器的使用方法,掌握PC机发声系统的工作原理。二、实验内容1.音符1、2、3、4、5、6、7的频率分别为350、393、441、467、525、589、661,编写一个程序,使用户按下17键时扬声器发出相应的音符,按下其他键退出程序。2.编写一个游戏程序,实现如下功能:首先用蓝色清屏在屏幕中央显示由字符串“-=#”组成的黄色的小蛇,#为蛇头,-为蛇尾。按下方向键可以控制上述小蛇按蛇行方式在屏幕上行走在行进过程中,蛇头只能左转、右转或继续前进,不能掉转180度。 3. 如下两个实验任选一个:(1). 编写一个程序,进入保护模式,并在保护模式下用不同属性在屏幕上显示字符串(字符串内容自定),然后返回实模式。 (2). 编写一个Windows应用程序,实现如下功能 程序运行时,首先在窗口的客户区显示“Programming Windows application in assembly is quite easy!”,如图1所示。 程序有两个菜单,第一个菜单有三个菜单项:执行菜单命令“Text1”,则在窗口的客户区显示“This string responds to the menu command Text1.”,如图2所示;执行菜单命令“Text2”,则在窗口的客户区显示“This string responds to the menu command Text2.”,如图3所示;执行菜单命令“Exit”,则结束程序,返回操作系统。 程序的第二个菜单只有一个菜单项“About”,执行该命令,则弹出一个消息框,显示“Hello, world! This is my first Windows application.”,如图4所示。图1图2图3图4三、程序清单及思路介绍1、音符1、2、3、4、5、6、7的频率分别为350、393、441、467、525、589、661,按下1-7键时扬声器发出相应的音符,按下其他键退出程序。设计思路:这个程序采用可编程计数器8253的工作方式三方波产生一定频率的声音,从而达到目的。程序首先在数据段里定义一个频率表便于查阅,在代码段,首先打开扬声器,同时为避免其发出不想得到的声音,首先命令8253产生高频方波(人耳听不到的声音),然后等待键入,通过比较、判断、查表,令8253产生相应频率,之后为了使声音较为正常,加入延时程序。在接受非1-7数字键时,关闭扬声器,退出程序。本程序加入了显示界面,使程序更友好。如下:源程序清单DATA SEGMENTTAB DW 350,393,441,467,525,589,661STR1 DB Press 1-7 to hear music!STR2 DB Press other key to exitDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATABEG:MOV AX,DATA ;段初始化 MOV DS,AX MOV ES,AX MOV AX,3 ;选择8025,彩色显示 INT 10H CLEAR: MOV AX,0600H MOV BH,00011110B ;采用INT 10H的6号功能刷屏 MOV CX,0 MOV DH,24 MOV DL,79 INT 10H MOV AX,1301H MOV BH,0 MOV BL,10011110B MOV CX,24 MOV DH,12 MOV DL,33 MOV BP,OFFSET STR1 ;显示提示信息 INT 10H MOV AX,1301H MOV BH,0 MOV BL,10011110B MOV CX,23 MOV DH,13 MOV DL,33 MOV BP,OFFSET STR2 ;显示提示信息 INT 10H OPEN:IN AL,61H ;打开扬声器 OR AL,03H OUT 61H,AL MOV AL,4 ; OUT 42H,AL ;输出f=1.19M/4的声音(听不到) MOV AL,0 ; OUT 42H,AL ; MOV AH,7 INT 21H CMP AL,37H JG EXITCMPAL,31H JC EXIT MOV AH,0MOVSI,OFFSET TAB ;查频率表 SUB AL,31H ADD AX,AX ADD SI,AX MOV CX,SI MOV DX,12H MOVAX,34DEH DIVCX ;产生8253初始数值 OUT42H,AL ;低八位 MOVAL,AH OUT42H,AL ;高八位DELAY : MOV AH,86H ;延时 MOV CX,0001H MOV DX,9FFFH INT 15H JMP OPENEXIT: IN AL,61H ;关闭扬声器 AND AL,0FCH OUT 61H,AL MOV AH,4CH ;返回DOS INT21HCODEENDS END BEG2、游戏程序,首先用蓝色清屏在屏幕中央显示由字符串“-=#”组成的黄色的小蛇,#为蛇头,-为蛇尾。按下方向键可以控制上述小蛇按蛇行方式在屏幕上行走在行进过程中,蛇头只能左转、右转或继续前进,不能掉转180度。设计思路:首先清楚蛇的运动方式,即按照蛇头的轨迹运动。然后再按照实际情况加以限制,如不能穿过墙壁(或者从另一侧出来也可),不能穿透自己的身体等。具体操作如下: 首先在数据段定义蛇的形状#=-,以及蛇的性质(位置),即开辟一个内存空间,便于今后记录蛇的位置。本程序中加入了游戏的欢迎画面,对操作作了简要介绍,并给出了如何进入和退出程序。程序运行显示画面如下: 然后进行主要的工作,接受进入信息后,利用INT 10H的06H功能刷屏,利用13H功能显示蛇的位置。然后接受键入,判断要求是向哪个方向移动,并进入相应的程序位置,这时候需要对其作进一步的判断,比如,若现在已经在第一行,接受向上移动的命令,则撞到边界,此时不再移动,跳到前面继续接收字符输入。若可移动,则往下走,在作更进一步的判断,及此时的移动是否撞到蛇的身体上,若是,则不宜动,回到开始。这样就给出了一个无法运动的位置,即当蛇头被身体包围时,再也无法移动,GAME OVER了,若可移动,此时把蛇头“#”写到移动到的位置,把“=”写到原蛇头的位置,把原尾巴处清空(写入SPACE),原来的尾巴第二个改成尾巴“-”,现在蛇的形状改变完毕,需要记录现在的位置,我是采用了移位的方法,把内存位置移动即可。上述计时程序的主要运行过程。参见下面的流程图:方向键入画蛇,准备移动蛇的位置信息存放空间准备工作,显示欢迎画面进入游戏 YESYES是否穿过身体判断是否撞墙通过移位改变内存,记录现在位置NO画四个位置head,neck,tail1,tailRIGHT:操作DOWN:操作LEFT:操作UP:操作上 下左 右判断方向并到相应位置NO运行结果源程序如下 ;FILENAME:SNAKE.ASM .486DATA SEGMENT USE16SNAKE DB -=#CHA DB 33,12,34,12,35,12,36,12,37,12,38,12,39,12 DB 40,12,41,12,42,12,43,12,44,12,45,12,46,12INF1 DB small game ; INF2 DB -=#snake#=- ;INF3 DB * ;INF4 DB * * ; INF5 DB * INSTRUCTIONS * ;INF6 DB * : RIGHT * ; 欢迎画面信息INF8 DB * : UP * ; INF9 DB * V : DOWN * ;INF10 DB * ESC: EXIT * ;INF11 DB * * ;INF12 DB * ;INF DB *991321* ;STRING DB PRESS ENTER TO THE GAME ;DATA ENDSDISP MACRO VAR,COLOR,LINE ;定义宏显示不同属性的字符 MOV AX,1301H MOV BH,0 MOV BL,COLOR MOV CX,32 MOV DH,LINE MOV DL,24 MOV BP,OFFSET VAR INT 10H ENDM;-CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATABEG: MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,3 ;8025,color INT 10HCLEAR0:MOV AX,0600H ;黑底 MOV BH,00000111B MOV CX,0 MOV DH,24 MOV DL,79 INT 10H DISP INF1,0FH,4 DISP INF2,0FH,5 DISP INF3,0FH,7 DISP INF4,0FH,8 DISP INF5,0FH,9 DISP INF6,0FH,10 DISP INF7,0FH,11 ;显示欢迎画面 DISP INF8,0FH,12 DISP INF9,0FH,13 DISP INF10,0FH,14 DISP INF11,0FH,15 DISP INF12,0FH,16 DISP INF,0FH,18 DISP STRING,82H,20 ;- MOV AH,07H INT 21H CMP AL,1BH ;按ESC 退出 JE EXIT CMP AL,0DH ;按ENTER进入 JE CLEARCLEAR: MOV AX,0600H MOV BH,00011110B MOV CX,0 MOV DH,24 ;蓝色清屏 MOV DL,79 INT 10H MOV AX,1301H MOV BH,0 MOV BL,00011110B MOV CX,14 ;显示中央黄蛇 MOV DH,12 MOV DL,33 MOV BP,OFFSET SNAKE INT 10H ;- LOOP1: MOV BX,0 MOV SI,OFFSET SNAKE MOV DI,OFFSET CHA MOV CH,20H ;不显示光标 MOV AH,1 INT 10H MOV AH,0 INT 16H CMP AL,1BH ;ESC退出 JE EXIT ADD DI,26 MOV CX,WORD PTR DI CMP AH,72 JE UP ;比较方向 CMP AH,80 JE DOWN CMP AH,75 JE LEFT CMP AH,77 JE RIGHT UP: CMP CH,0 ;撞墙则跳到前面 JE LOOP1 DEC CH JMP CHECKDOWN: INC CH CMP CH,24 JA LOOP1 JMP CHECK LEFT: CMP CL,0 JE LOOP1 DEC CL JMP CHECK RIGHT:INC CL CMP CL,78 JA LOOP1 JMP CHECK CHECK: MOV AX,CX ;检验是否穿过自己身体 MOV CX,14; MOV DI,OFFSET CHA LOOP2: CMP AX,WORD PTR DI JE LOOP1 ADD DI,2 LOOP LOOP2 MOV CX,AX MOV DI,OFFSET CHAPRINT:MOV AH,2 MOV DX,CX INT 10H MOV AH,2 ;画蛇头 MOV DL,#;SI+13 INT 21H MOV AH,2 MOV DX,WORD PTR DI+26 INT 10H MOV AH,2 ;画蛇脖子 MOV DL,=;SI+12 INT 21H MOV AH,2 MOV DX,WORD PTR DI+2 INT 10H MOV AH,2 ;画蛇尾巴 MOV DL,-;SI+1 INT 21H MOV AH,2 MOV DX,WORD PTR DI INT 10H ;蛇尾第二节 MOV AH,2 MOV DL, ;SPACE INT 21H MOV BX,CX MOV CX,13 LOOP3:SAR DWORD PTR DI,16 ;内存左移,记录现在位置 ADD DI,2 LOOP LOOP3 MOV WORD PTR DI,BX JMP LOOP1 EXIT:MOV AH,4CH ;回到DOS INT 21HCODE ENDS END BEG3、运行程序,进入保护模式,并在保护模式下用不同属性在屏幕上显示字符串(英文诗windflowers),然后返回实模式。设计思路这个实验基本上不需自己设计,利用老师给定的程序,在PROTECT:里面将在数据段里定义的字符串写到相应的内存空间即可。但不可调用DOS的INT21H的09功能。源程序清单 DATE SEGMENTGDTADDRESS DB 1FH, 00H, 00H, 00H, 00H, 00H ; -+- -+-; | | ; | GDT的基址 ; +-GDT的限长 ; GDT DB 000H,000H,000H,000H,000H,000H,000H,000H ;保留段 CODESEG DB 0FFH,0FFH,000H,000H,000H,09BH,000H,000H ;代码段CODE:0, 选择符0008HDATESEG DB 0FFH,0FFH,000H,000H,000H,093H,000H,000H ;数据段DATE:0, 选择符0010HSCRENSEG DB 0FFH,0FFH,000H,080H,00BH,093H,000H,000H ;屏幕段B800:0, 选择符0018H; -+- -+-; | |; +-+-段在线性地址空间的基址; ERRMSG DB You are currently running in V86 mode, DB This program must be run in real mode!, 0DH, 0AH, $RMMSG_1 DB 0DH, 0AH, Now in real mode, press Enter DB key to switch to protected mode, 0DH, 0AH, $RMMSG_2 DB 0DH, 0AH, Back in real mode, press Enter DB key to return DOS, 0DH, 0AH, $PMMSG DB Now in protected mode !COUNT EQU $-PMMSGPMMSG_1 DB Windflowers,windflowersCOUNT_1 EQU $-PMMSG_1PMMSG_2 DB my father told me not to go near themCOUNT_2 EQU $-PMMSG_2PMMSG_3 DB He said he feared them alwaysCOUNT_3 EQU $-PMMSG_3PMMSG_4 DB and he told me that they carried him awayCOUNT_4 EQU $-PMMSG_4DATE ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATE.386PSTART PROC NEAR MOV AX, DATE MOV DS, AX SMSW AX ; AND AX, 01H ; JZ BEGIN ; MOV AH, 09H ;检查当前工作模式,如果已经在保护模式则退出 MOV DX, OFFSET ERRMSG ; INT 21H ; JMP EXITBEGIN: MOV AH, 09H MOV DX, OFFSET RMMSG_1 INT 21HWAIT_1: MOV AH, 00H INT 16H CMP AL, 0DH JNZ WAIT_1 XOR EAX, EAX XOR EBX, EBX MOV AX, DS SHL EAX, 04H MOV BX, OFFSET GDT ADD EAX,EBX ;EAX现为GDT在线性地址空间的基址 MOV BX, OFFSET GDTADDRESS+2 MOV BX, EAX ;设置GDT的基址 XOR EAX, EAX ; XOR EBX, EBX ; MOV AX, CS ; SHL EAX, 04H ; MOV BX, OFFSET CODESEG ;设置GDT中CODE段的基址 MOV BX+02H, AX ;CODE段的选择符为0008H SHR EAX, 10H ; MOV BX+04H, AL ; MOV BX+07H, AH ; XOR EAX, EAX ; XOR EBX, EBX ; MOV AX, DS ; SHL EAX, 04H ; MOV BX, OFFSET DATESEG ;设置GDT中DATE段的基址 MOV BX+02H, AX ;DATE段的选择符为0010H SHR EAX, 10H ; MOV BX+04H, AL ; MOV BX+07H, AH ; CLI MOV BX, OFFSET GDTADDRESS LGDT FWORD PTR BX ;装入GDT MOV EAX, CR0 OR EAX, 01H MOV CR0, EAX JMP PROTECTION ;进入保护模式 PROTECTION : MOV AX, 0010H ; MOV DS, AX ; MOV SI, OFFSET PMMSG ; MOV AX, 0018H ; MOV ES, AX ; MOV DI, 160*1+2*2 ;将0010:MSG_1 传送到 0018:0000 MOV AH, 70H ;其效果为在屏幕上显示MSG_1 /棕白 MOV CX, COUNT ; CLD ; SHOW: ; LODSB ; STOSW ; LOOP SHOW ; MOV SI, OFFSET PMMSG_1 ; MOV DI, 160*4+4*2 ;将0010:MSG_1 传送到 0018:0000 MOV AH, 1EH ;其效果为在屏幕上显示MMSG1 蓝黄 MOV CX, COUNT_1 ; CLD ; SHOW_1: ; LODSB ; STOSW ; LOOP SHOW_1 ; MOV SI, OFFSET PMMSG_2 ; MOV DI, 160*8+6*2 ;将0010:MSG_1 传送到 0018:0000 MOV AH, 2CH ;其效果为在屏幕上显示MMSG2 绿红 MOV CX, COUNT_2 ; CLD ; SHOW_2: ; LODSB ; STOSW ; LOOP SHOW_2 ; MOV SI, OFFSET PMMSG_3 ; MOV DI, 160*12+8*2 ;将0010:MSG_1 传送到 0018:0000 MOV AH, 0FH ;其效果为在屏幕上显示MMSG3 黑白 MOV CX, COUNT_3 ; CLD ; SHOW_3: ; LODSB ; STOSW ; LOOP SHOW_3 ; MOV SI, OFFSET PMMSG_4 ; MOV DI, 160*16+10*2 ;将0010:MSG_1 传送到 0018:0000 MOV AH, 34H ;其效果为在屏幕上显示MMSG4 青红 MOV CX, COUNT_4 ; CLD ; SHOW_4: ; LODSB ; STOSW ; LOOP SHOW_4 ; MOV EAX, CR0 AND AL, 0FEH MOV CR0, EAX JMP REAL_MODE ;返回实模式 REAL_MODE : STI MOV AX, DATE MOV DS, AX MOV AH, 09H MOV DX, OFFSET RMMSG_2 INT 21H WAIT_2: MOV AH, 00H INT 16H CMP AL, 0DH JNZ WAIT_2EXIT: MOV AH,4CH INT 21HSTART ENDP CODE ENDS END START 4、编写一个Windows应用程序,显示如前图所示。设计思路 这个实验在老师给定的程序里定义另外两个IDM_text1,IDM_text2,在Wnd_proc里面根据不同的要求完成。具体程序见下:源程序清单 .386.model flat,stdcallWinMain proto :DWORD,:DWORD,:DWORD,:DWORDinclude windows.incinclude user32.incinclude kernel32.inc.dataClassName db SimpleWinClass,0AppName db My First Window,0MenuName db FirstMenu,0Text_string1 db This string responds to menu command Text1.,0Text_string2 db This string responds to menu command Text2.,0Text_string3 db Programming Windows application in assembly is quite easy!,0About_string db Hello, world! This is my first Windows application.,0.data?hInstance HINSTANCE ?CommandLine LPSTR ?.constIDM_Text1 equ 1IDM_Text2 equ 2IDM_EXIT equ 3IDM_ABOUT equ 4.codestart:INVOKE GetModuleHandle, NULLmov hInstance,eaxINVOKE GetCommandLinemov CommandLine,eaxINVOKE WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULTINVOKE ExitProcess,eaxWinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORDLOCAL wc:WNDCLASSEXLOCAL msg:MSGLOCAL hwnd:HWNDmov wc.cbSize,SIZEOF WNDCLASSEXmov wc.style, CS_HREDRAW or CS_VREDRAWmov wc.lpfnWndProc, OFFSET WndProcmov wc.cbClsExtra,NULLmov wc.cbWndExtra,NULLpush hInstpop wc.hInstancemov wc.hbrBackground,COLOR_WINDOW+1mov wc.lpszMenuName,OFFSET MenuNamemov wc.lpszClassName,OFFSET ClassNameINVOKE LoadIcon,NULL,IDI_APPLICATIONmov wc.hIcon,eaxmov wc.hIconSm,eaxINVOKE LoadCursor,NULL,IDC_ARROWmov wc.hCursor,eaxINVOKE RegisterClassEx, addr wcINVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL, hInst,NULLmov hwnd,eaxINVOKE ShowWindow, hwnd,SW_SHOWNORMALINVOKE UpdateWindow, hwnd.WHILE TRUE INVOKE GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) INVOKE DispatchMessage, ADDR msg.ENDWmov eax,msg.wParamretWinMain endpWndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAMLOCAL hdc:HDCLOCAL ps:PAINTSTRUCTLOCAL rect:RECT.IF uMsg=WM_DESTROYINVOKE PostQuitMessage,NULL.ELSEIF uMsg=WM_COMMA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论