收藏 分享(赏)

80X86汇编语言程序设计实验指导书.doc

上传人:dreamzhangning 文档编号:2234363 上传时间:2018-09-06 格式:DOC 页数:84 大小:1.25MB
下载 相关 举报
80X86汇编语言程序设计实验指导书.doc_第1页
第1页 / 共84页
80X86汇编语言程序设计实验指导书.doc_第2页
第2页 / 共84页
80X86汇编语言程序设计实验指导书.doc_第3页
第3页 / 共84页
80X86汇编语言程序设计实验指导书.doc_第4页
第4页 / 共84页
80X86汇编语言程序设计实验指导书.doc_第5页
第5页 / 共84页
点击查看更多>>
资源描述

1、80X86汇编语言程序设计实验指导书中南民族大学计算机科学学院2008 年 3 月1目 录实验一 实验的基本要求与方法 .1实验二 顺序程序设计 .13实验三 分支程序设计 .18实验四 循环程序设计 .24实验五 子程序设计 .31实验六 串操作指令的使用 .36实验七 位运算指令的使用 .41附录 A MASM 6.X 45附录 B Windbg 的使用 46附录 C I/O 宏说明 .49附录 D 汇编指令总汇 .65附录 E 流程图规范 821实验一 实验的基本要求与方法1.1 实验目的与要求1.1.1 实验目的实验是掌握汇编语言程序设计的步骤,学习使 80X86 汇编语言程序设计的基

2、本方法和技能,熟练掌握用汇编语言设计、编码、调试和运行程序的方法,养成良好的程序设计习惯,为后续课程和将来相关的项目开发打下坚实的基础。1. 熟练操作宏汇编的开发环境,熟悉汇编语言的编译工具(MASM6.11)及调试器(Windbg)的使用。2. 掌握汇编语言的寻址方式和常用指令。3. 掌握汇编语言基本的程序设计方法和调试手段。4. 掌握子程序和宏指令的设计和调试手段。1.1.2 实验要求1. 上机前应做好充分的准备。对选定的实验题要先进行设计包括程序框图、数据结构以及算法;上机之前先编好程序代码,并进行认真地静态检查,减少错误的发生,同时还有预先估计程序运行的结果或结果范围,做到心中有数。2

3、. 上机时要遵守实验室的规章制度,爱护实验设备。要熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。在程序的调试过程中,有意识的学习及掌握 Windbg 程序的各种功能,以便掌握程序的调试方法和技巧。不互相抄袭,应自己动手按自己的算法编制程序,调试通过。3. 下机后要对实验结果进行整理,分析程序调试过程中所出现的各种情况,对未通过的程序更好认真分析原因,总结经验教训。4. 每个程序完成后应写出实验报告,实验报告的要求如下:(1) 本次实验的目的及要求,实验内容。(2) 设计说明:用来说明程序的功能和结构,它包括:程序名、功能、原理及算法说明、数据结构及主要符号名

4、说明等。(3) 程序框图: 根据设计思想给出规范的程序流程图,流程图规范参看附录 E。(4) 调试说明:总结经验提高编程及调试能力。它包括:调试情况,如上机时遇到的问题及解决的办法,观察到的现象及其分析,对程序设计技巧的总结及分析等;程序的输出结果及对结果的分析;实验的心得体会等。(5) 使用说明:程序提供给用户使用时必须作出的说明。如:程序的使方法,调用方式,操作步骤等;要求输入信息的类型及格式;出错信息的含义及程序的使用范围等。(6) 程序清单。21.2 实验方法例 1.1 求两数之和。试编写一程序,输出提示信息,从键盘输入两个数 number1 和 number2,求它们的之和并显示结果

5、。1 进入 windows 下的 DOS 命令行环境鼠标点击 Windows 系统的“开始”“运行” ,输入“cmd”回车后(如图 1.1) ,进入 windows 下的 DOS 命令行环境(图 1.2) 。图 1.1图 1.2 DOS 命令行环境这里设定所需软件都安装在 C 盘的 masm 目录下。使用 DOS 的 CD 命令进入masm 目录(图 1.3) 。输入: cd c:masm (回车)3图 1.3 进入汇编程序目录2 调用文本编辑程序 EDIT 建立汇编源文件(后缀名为.asm)在当前目录,输入:edit example.asm后就可进入编辑环境(图 1.4) 。图 1.4 ED

6、IT 编辑环境也可以用其他编辑程序如记事本等来建立源程序(建议不要用 office word) 。建议以 example.asm 为文件名的源文件如图 1.5。;*; Example assembly language program - adds two numbers; Author: R. Detmer; Date: revised 7/97;-.386.MODEL FLAT;-ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD;-INCLUDE io.h ; header file for input/output;-4cr EQU 0

7、dh ; carriage return characterLf EQU 0ah ; line feed;-.STACK 4096 ; reserve 4096-byte stack;-.DATA ; reserve storage for datanumber1 DWORD ?number2 DWORD ?prompt1 BYTE “Enter first number: “, 0 prompt2 BYTE “Enter second number: “, 0 string BYTE 40 DUP (?)label1 BYTE cr, Lf, “The sum is “ sum BYTE 1

8、1 DUP (?)BYTE cr, Lf, 0;-.CODE ; start of main program code_start:output prompt1 ; prompt for first numberinput string, 40 ; read ASCII charactersatod string ; convert to integermov number1, eax ; store in memoryoutput prompt2 ; repeat for second numberinput string, 40atod stringmov number2, eaxmov

9、eax, number1 ; first number to EAXadd eax, number2 ; add second numberdtoa sum, eax ; convert to ASCII charactersoutput label1 ; output label and sumINVOKE ExitProcess, 0 ; exit with return code 0PUBLIC _start ; make entry point public;-END ; end of source code;*图 1.5 例 1.1 的源文件 example.asm53 用汇编程序

10、ml 对源文件汇编产生目标文件(后缀名为.obj)输入: ml /c /coff /Zi example.asm显示如图 1.6,则表示汇编成功,同时生成了目标文件(example.obj) 。如果汇编指示出错则需重新调用编辑程序修改错误,直至汇编通过为止。图 1.64 用连接程序 link 产生可执行文件(后缀名为.exe)输入: link /debug /subsystem:console /entry:start /out:example.exe example.obj io.obj kernel32.lib显示如图 1.7,则表示连接成功,同时生成了可执行文件(example.exe)

11、图 1.75 执行程序可直接在当前目录下执行如下:输入: example显示结果如图 1.8。图 1.8 example.exe 运行结果6 查看列表文件(后缀名为.lst)在进行汇编时候,如果在输入参数中加上“/Fl”,则可生成和列表文件(example.lst)。输入: ml /c /coff /Zi /Fl example.asm用编辑软件打开 example.lst(图 1.9)。Microsoft (R) Macro Assembler Version 6.11 08/03/05 15:19:43example.asm Page 1 - 1; Example assembly lan

12、guage program - adds two numbers; Author: R. Detmer; Date: revised 7/976.386.MODEL FLATExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORDINCLUDE io.h ; header file for input/outputC ; IO.H - header file for I/O macrosC ; 32-bit version for flat memory modelC ; R. Detmer last revised 8/2000C .NOLIST

13、; turn off listingC .LIST ; begin listingC = 0000000D cr EQU 0dh ; carriage return character= 0000000A Lf EQU 0ah ; line feed.STACK 4096 ; reserve 4096-byte stack00000000 .DATA ; reserve storage for data00000000 00000000 number1 DWORD ?00000004 00000000 number2 DWORD ?00000008 45 6E 74 65 72 prompt1

14、 BYTE “Enter first number: “, 020 66 69 72 7374 20 6E 75 6D62 65 72 3A 2020 000000001E 45 6E 74 65 72 prompt2 BYTE “Enter second number: “, 020 73 65 63 6F6E 64 20 6E 756D 62 65 72 3A20 20 0000000035 00000028 string BYTE 40 DUP (?)000000005D 0D 0A 54 68 65 label1 BYTE cr, Lf, “The sum is “20 73 75 6

15、D 2069 73 200000006A 0000000B sum BYTE 11 DUP (?)00700000075 0D 0A 00 BYTE cr, Lf, 000000000 .CODE ; start of main program code00000000 _start:output prompt1 ; prompt for first numberinput string, 40 ; read ASCII charactersatod string ; convert to integer0000002E A3 00000000 R mov number1, eax ; sto

16、re in memoryoutput prompt2 ; repeat for second numberinput string, 40atod string00000061 A3 00000004 R mov number2, eax00000066 A1 00000000 Rmov eax, number1 ; first number to EAX0000006B 03 05 00000004 R add eax, number2 ; add second numberdtoa sum, eax ; convert to ASCII charactersoutput label1 ;

17、output label and sumINVOKE ExitProcess, 0 ; exit with return code 000000097 PUBLIC _start ; make entry point publicEND ; end of source code8Microsoft (R) Macro Assembler Version 6.11 08/03/05 15:19:43example.asm Symbols 2 - 1Macros:N a m e Typeatod . . . . . . . . . . . . . . Procatoi . . . . . . .

18、. . . . . . . Procdtoa . . . . . . . . . . . . . . Procinput . . . . . . . . . . . . . Procitoa . . . . . . . . . . . . . . Procoutput . . . . . . . . . . . . . ProcSegments and Groups:N a m e Size Length Align Combine ClassFLAT . . . . . . . . . . . . . . GROUPSTACK . . . . . . . . . . . . . 32 Bit

19、 00001000 DWord Stack STACK _DATA . . . . . . . . . . . . . 32 Bit 00000078 DWord Public DATA_TEXT . . . . . . . . . . . . . 32 Bit 00000097 DWord Public CODEProcedures, parameters and locals:N a m e Type Value Attr$00001 . . . . . . . . . . P Near 00000001 _TEXT Length= 00000096 PrivateExitProcess

20、. . . . . . . . . . P Near 00000000 FLAT Length= 00000000 External STDCALLSymbols:N a m e Type Value AttrCodeSize . . . . . . . . . . . Number 00000000h DataSize . . . . . . . . . . . Number 00000000h 9Interface . . . . . . . . . . . Number 00000000h Model . . . . . . . . . . . . . Number 00000007h

21、code . . . . . . . . . . . . . Text _TEXTdata . . . . . . . . . . . . . Text FLATfardata? . . . . . . . . . . . Text FLATfardata . . . . . . . . . . . . Text FLATstack . . . . . . . . . . . . . Text FLATLf . . . . . . . . . . . . . . . Number 0000000Ah _start . . . . . . . . . . . . . L Near 0000000

22、0 _TEXT Publicatodproc . . . . . . . . . . . . L Near 00000000 FLAT Externalatoiproc . . . . . . . . . . . . L Near 00000000 FLAT Externalcr . . . . . . . . . . . . . . . Number 0000000Dh dtoaproc . . . . . . . . . . . . L Near 00000000 FLAT Externalinproc . . . . . . . . . . . . . L Near 00000000 F

23、LAT Externalitoaproc . . . . . . . . . . . . L Near 00000000 FLAT Externallabel1 . . . . . . . . . . . . . Byte 0000005D _DATAnumber1 . . . . . . . . . . . . DWord 00000000 _DATAnumber2 . . . . . . . . . . . . DWord 00000004 _DATAoutproc . . . . . . . . . . . . L Near 00000000 FLAT Externalprompt1 .

24、 . . . . . . . . . . . Byte 00000008 _DATAprompt2 . . . . . . . . . . . . Byte 0000001E _DATAstring . . . . . . . . . . . . . Byte 00000035 _DATAsum . . . . . . . . . . . . . . Byte 0000006A _DATA0 Warnings0 Errors图 1.9 列表文件 example.lst7 使用调试软件 windbg 调试程序1)打开 Windbg 程序输入:windbg或直接在 window 界面下打开 C 盘

25、上的文件夹 masm,双击 windbg.exe 程序的图标,也可以运行 windbg,并看到如图 1.10 的窗口。 10图 1.10 Windbg 打开界面2)打开可执行文件在 File 菜单中打开“Executable ”后选择“example.exe”或其他可执行文件,标题栏中增加了 example.exe,以及 command 窗口中还出现一些文字。点击“进入” (step into, F11 or F8)按钮,图标如 。在信息窗口中点击确认后,再点击“进入”按钮,现在源代码就出现在 Command窗口后面的子窗口中。将 Command 窗口最小化,选择 View 菜单,然后选择 R

26、egister 子菜单,打开一个窗口,用来显示 80X86 中寄存器的内容。然后选择 View 菜单下 Memory 子菜单,打开一个窗口用来显示内存的内容,对于该窗口来说,必须输入内存的开始地址。例如,在 example.asm 中,使用*;功能:计算矩形面积;作者:;日期:;*.386.model flatExitProcess proto near32 stdcall, dwexitcode:dword;-include io.hcr equ 0dh ;回车lf equ 0ah ;换行;-.stack 4096 ;预留 4096 字节的堆栈;-.data ;数据保留区prompt1 by

27、te “This program will find the area of a rectangle“,cr,lf,lfbyte “Width of rectangle?“,0prompt2 byte “Length of rectangle? “,0value byte 16 dup(?)answer byte cr,lf,“The area of the rectangle is“area byte 11 dup(?)byte cr, lf, 0;-16.code ;主程序代码开始_start:output prompt1 ;提示输入宽度input value,16 ;读取 ASCII 字

28、符atod value ;转换为整数mov ebx,eax ;将宽度值保存到 ebx 寄存器output prompt2 ;提示输入长度input value,16 ;读取 ASCII 字符atod value ;转换为整数mul ebx ;计算长宽,得到面积值dtoa area,eax ;将面积结果转换为字符集output answer ;输出提示信息和最后得到的结果invoke ExitProcess,0 ;退出并返回 0public _start ;公开程序入口end ;*2.3 实验题实验 2.1 计算成绩总分和平均分1 题目:计算输入成绩的总分和平均分数,并显示计算结果。2 实验要求

29、:程序接收用户键入的 4 个成绩,并计算出这 4 个成绩的总分和平均分数。在用户键入每个成绩和显示总分和平均分数之前都要有相应的提示信息。当用户输入的成绩不在0,100 之间时,显示错误信息并重新等待正确输入。3 提示:首先在数据段中定义提示信息、累计总分变量 sum 和平均分数变量average。程序一开始初始化 sum 值为 0,当用户每输入一个成绩后累加到 sum 中。4 个成绩输入完成后,sum 内的值除以 4 得到平均分数并保存到 average 中。最后显示计算结果。实验 2.2 华氏温度转换为摄氏温度1. 题目:输入华氏温度,显示其对应的摄氏温度2. 实验要求:程序从键盘接收用户

30、键入的华氏温度值,根据转换公式运算后,显示对应的摄氏温度值。在用户输入和显示转换结果之前都要有相应的提示信息。173. 提示:首先在数据段中定义提示信息、华氏温度值变量 TemperatureF 和摄氏温度值变量 TemperatureC。当用户输入华氏温度值后,进行运算,然后显示计算结果。转换公式:C = (5/9) * (F-32) ;其中 F 是华氏温度,C 是摄氏温度实验 2.3 字符显示1. 题目:输入一个字符,找出它的前导字符和后续字符,并按顺序显示这三个字符。2. 实验要求:程序从键盘接收用户输入的一个字符后,然后分别找出它的前导字符和后续字符,再按顺序显示这三个字符。在用户输入

31、和显示字符之前都要有相应的提示信息。3. 提示:从 AL 寄存器得到它的 ASCII 码,它的前导字符和后续字符的 ASCII 码分别比它的 ASCII 码少 1 或多 1。然后分别显示这三个字符。实验 2.4 计算总评成绩1. 题目:从键盘输入一同学的期中成绩、实验成绩、期末成绩和它们在总评成绩中分别占的百分比,计算得到该同学的总评成绩,并显示出来。2. 实验要求:该程序提示输入 3 个成绩和所占百分比。可参考如下的例子显示:grade 1 ? 85percent 1 ? 20grade 2 ? 75percent 2 ? 20grade 3 ? 82percent 3 ? 60score

32、is : 813. 提示: 总评成绩 (期中成绩百分比 1实验成绩百分比 2期末成绩百分比 3)/10018实验三 分支程序设计3.1 实验目的与要求3.1.1 实验目的掌握分支程序设计的原理和方法,重点掌握各种分支程序中形成和判断条件而产生的程序段的设计方法和技巧。3.1.2 实验要求(1) 如何产生条件 (2) 如何对条件进行判断 (3) 如何实现分支3.2 示例例 3.1 猜数字游戏计算机要求第一个人输入一个数字,数字输入后清屏;然后另一个人来猜这个数字,每猜测一次,计算机都提示是“太大了”还是“太小了” ,或者是“答对了” 。猜对之后,猜过的数字的数目会显示在屏幕上,并询问时候要开始下

33、一次游戏。1 分析在该程序里面有 2 个地方需要进行分支设计。第一个分支设计是判断第二人输入的数字是否等于第一人输入的数字,判断结果有三种:大于、小于和等于。其中判断结果为大于和小于就必须等待下一次输入数字;如果结果为等于,则输出猜测次数,并等待用户输入是否继续游戏,也就是进入第二个分支。在第二个分支里面,如果用户输入“Y” ,程序重新开始一次新游戏,否则退出程序。在这里要确定用哪些跳转指令,在进行分支之前先设计好标号。2 流程图例 3.1 的流程图见图 3.1。19开 始结 束第 一 个 人 输 入 target清 屏count 0count=count+1第 二 人 猜 数输 入 gues

34、gues与 tart比 较 显 示 “答 对 了 ” 显 示“太 小 了 ” 显 示“太 大 了 ”将 count转 换 为ASCI码 并 显 示显 示 “是 否 要 再 玩 一 遍 ?”并 等 待 键 盘 输 入输 入 的 是 ? 0) loop将数字转换为二进制补码;25将转换后的数字存储到数组中;nbrElts 加 1;取出数组中下一项的地址;end while;求总和和平均值sum := 0; 取出数组中第一项的地址;for count := nbrElts downto 1 loop加数组当前项元素到 sum;取出数组中下一项的地址;end for;平均值总和/ nbrElts 平均

35、值 := sum/nbrElts; 显示平均值; 列出大于平均值的数取出数组中第一项的地址;for count := nbrElts downto 1 loopif 数组当前项元素 平均值then转换当前项元素为 ASCII 码;显示该元素;end if;取出数组中下一项的地址;end for;3 寄存器分配情况和变量说明。定义几个显示提示信息,分别用于提示用户输入和显示统计结果。定义数组 nbrArray 保存输入的所有数,变量 nbrElts 统计用户输入数的个数,变量number 用于保存当前用户输入的数,变量 outValue 保存计算的平均值的 ASCII 码。4 运行情况程序运行情

36、况如图 4.1。26图 4.1 例 4.1 程序运行结果5 例 4.1 源程序清单;*; 输入一组数字集合,并显示它们的平均数以及在平均数以上的数; 作者: ; 日期: ;*.386.MODEL FLAT;-INCLUDE io.h;-ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD;-cr EQU 0dh ; 回车Lf EQU 0ah ; 换行maxNbrs EQU 100 ; 数组的大小;-.STACK 4096;-27.DATAdirections BYTE cr, Lf, You may enter up to 100 numbers

37、BYTE one at a time.,cr,LfBYTE Use any negative number to terminate input.,cr,Lf,LfBYTE This program will then report the average and list,cr,LfBYTE those numbers which are above the average.,cr,Lf,Lf,Lf,0prompt BYTE Number? ,0number BYTE 20 DUP (?)nbrArray DWORD maxNbrs DUP (?)nbrElts DWORD ?avgLabe

38、l BYTE cr,Lf,Lf,The average isoutValue BYTE 11 DUP (?), cr,Lf,0aboveLabel BYTE cr,Lf,Above average:,cr,Lf,Lf,0;-.CODE_start:; input numbers into arrayoutput directions ; 显示程序功能介绍信息mov nbrElts,0 ; 输入个数 nbrElts 清 0lea ebx,nbrArray ; 取出 nbrArray 数组的起始地址whilePos: output prompt ; 提示输入数input number,20 ; 取

39、数到 numberatod number ;转换为整数jng endWhile ; 如果不是正数,则退出mov ebx,eax ; 将数存储到数组中inc nbrElts ; nbrElts 加 1add ebx,4 ; 取出数组中下一项的地址jmp whilePos ; 重复endWhile:; find sum and averagemov eax,0 ; 总和 sum := 0lea ebx,nbrArray ; 取出 nbrArray 数组的起始地址mov ecx,nbrElts ; count := nbrEltsjecxz quit ; 如果数组中没有数,则退出程序forCount

40、1: add eax,ebx ; 加 number 到 sum 中28add ebx,4 ; 取出数组中下一项的地址loop forCount1 ; 重复 nbrElts 次cdq ; 扩展 sum 到四倍字长idiv nbrElts ; 计算平均数dtoa outValue,eax ; 将平均数转换为 ASCII 码output avgLabel ; 输出提示信息和平均数output aboveLabel ; 输出大的数的信息; display numbers above averagelea ebx,nbrArray ; 取出 nbrArray 起始地址mov ecx,nbrElts ;

41、count := nbrEltsforCount2: cmp ebx,eax ; 当前数组元素 平均数?jng endIfBig ; 如果不大于平均数,则跳转到 endIfBigdtoa outValue,ebx ; 将数组元素的值转换为 ASCII 码output outValue ; 显示值endIfBig:add ebx,4 ; 取出数组中下一项的地址loop forCount2 ; 重复 nbrElts 次quit: INVOKE ExitProcess, 0 ; 返回代码 0,退出PUBLIC _start ; 公开程序入口点END ; 源代码结束;*4.3 实验题实验 4.1 求毕达哥拉斯三角形的边1 题目:给定一条最长边,求所有可能的毕达哥拉斯三角形。2 实验要求:一个毕达哥拉斯三角形的三条边是由

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报