80 x86汇编语言程序设计实验指导书_第1页
80 x86汇编语言程序设计实验指导书_第2页
80 x86汇编语言程序设计实验指导书_第3页
80 x86汇编语言程序设计实验指导书_第4页
80 x86汇编语言程序设计实验指导书_第5页
已阅读5页,还剩87页未读 继续免费阅读

下载本文档

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

文档简介

1、80x86汇编语言程序设计实验指导书中南民族大学计算机科学学院2006年9月44目 录实验一 实验的基本要求与方法1实验二 顺序程序设计13实验三 分支程序设计18实验四 循环程序设计24实验五 子程序设计31实验六 串操作指令的使用36实验七 位运算指令的使用41实验八 宏汇编技术45附录a masm 6.x53附录b windbg的使用54附录c i/o宏说明57附录d 汇编指令总汇73附录e 流程图规范90实验一 实验的基本要求与方法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) 设计说明:用来说明程序的功能和结构,它包括:程序名、功能、原理及算法说明、数据结构及主要符号名说明等。(3) 程序框图: 根据设计思想给出规范

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

5、ows系统的“开始”>“运行”,输入“cmd”回车后(如图1.1),进入windows下的dos命令行环境(图1.2)。图1.1图1.2 dos命令行环境这里设定所需软件都安装在c盘的masm目录下。使用dos的cd命令进入masm目录(图1.3)。 输入: cd c:masm (回车)图1.3 进入汇编程序目录2 调用文本编辑程序edit建立汇编源文件(后缀名为.asm)在当前目录,输入:edit example.asm后就可进入编辑环境(图1.4)。图1.4 edit编辑环境也可以用其他编辑程序如记事本等来建立源程序(建议不要用office word)。建议以example.asm为

6、文件名的源文件如图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;-cr equ 0dh ; carriage return characterlf equ 0ah ; line feed;-.stack 4096 ;

7、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 11 dup (?) byte cr, lf, 0;-.code ; star

8、t of main program code_start: output prompt1 ; prompt for first number input string, 40 ; read ascii characters atod string ; convert to integer mov number1, eax ; store in memory output prompt2 ; repeat for second number input string, 40 atod string mov number2, eax mov eax, number1 ; first number

9、to eax add eax, number2 ; add second number dtoa sum, eax ; convert to ascii characters output label1 ; output label and sum invoke exitprocess, 0 ; exit with return code 0public _start ; make entry point public;-end ; end of source code;*图1.5 例1.1的源文件example.asm3 用汇编程序ml对源文件汇编产生目标文件(后缀名为.obj)输入: ml

10、 /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)图1.75 执行程序可直接在当前目录下执行如下:输入: example显示

11、结果如图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 language program - adds two numbers; author: r

12、. detmer; date: revised 7/97.386.model flatexitprocess proto near32 stdcall, dwexitcode:dwordinclude io.h ; header file for input/output c ; io.h - header file for i/o macros c ; 32-bit version for flat memory model c ; r. detmer last revised 8/2000 c .nolist ; turn off listing c .list ; begin listi

13、ng c = 0000000dcr equ 0dh ; carriage return character = 0000000alf equ 0ah ; line feed.stack 4096 ; reserve 4096-byte stack 00000000.data ; reserve storage for data 00000000 00000000number1 dword ? 00000004 00000000number2 dword ? 00000008 45 6e 74 65 72prompt1 byte "enter first number: ",

14、 0 20 66 69 72 73 74 20 6e 75 6d 62 65 72 3a 20 20 00 0000001e 45 6e 74 65 72prompt2 byte "enter second number: ", 0 20 73 65 63 6f 6e 64 20 6e 75 6d 62 65 72 3a 20 20 00 00000035 00000028 string byte 40 dup (?) 00 0000005d 0d 0a 54 68 65label1 byte cr, lf, "the sum is " 20 73 75

15、 6d 20 69 73 20 0000006a 0000000b sum byte 11 dup (?) 00 00000075 0d 0a 00 byte cr, lf, 0 00000000.code ; start of main program code 00000000_start: output prompt1 ; prompt for first number input string, 40 ; read ascii characters atod string ; convert to integer0000002e a3 00000000 r mov number1, e

16、ax ; store in memory output prompt2 ; repeat for second number input string, 40 atod string00000061 a3 00000004 r mov number2, eax 00000066 a1 00000000 rmov eax, number1 ; first number to eax 0000006b 03 05 00000004 r add eax, number2 ; add second number dtoa sum, eax ; convert to ascii characters o

17、utput label1 ; output label and sum invoke exitprocess, 0 ; exit with return code 0 00000097public _start ; make entry point publicend ; end of source codemicrosoft (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 . . . . . . . . . . .

19、. .32 bit 00001000 dword stack 'stack' _data . . . . . . . . . . . . .32 bit 00000078 dword public 'data'_text . . . . . . . . . . . . .32 bit 00000097 dword public 'code'procedures, parameters and locals: n a m e type value attr$00001 . . . . . . . . . .p near 00000001 _text

20、length= 00000096 privateexitprocess . . . . . . . . . .p near 00000000 flatlength= 00000000 external stdcallsymbols: n a m e type value attrcodesize . . . . . . . . . . .number 00000000h datasize . . . . . . . . . . .number 00000000h interface . . . . . . . . . . .number 00000000h model . . . . . .

21、. . . . . . .number 00000007h code . . . . . . . . . . . . .text _textdata . . . . . . . . . . . . .text flatfardata? . . . . . . . . . . .text flatfardata . . . . . . . . . . . .text flatstack . . . . . . . . . . . . .text flatlf . . . . . . . . . . . . . . .number 0000000ah _start . . . . . . . .

22、. . . . .l near 00000000 _textpublicatodproc . . . . . . . . . . . .l near 00000000 flatexternalatoiproc . . . . . . . . . . . .l near 00000000 flatexternalcr . . . . . . . . . . . . . . .number 0000000dh dtoaproc . . . . . . . . . . . .l near 00000000 flatexternalinproc . . . . . . . . . . . . .l n

23、ear 00000000 flatexternalitoaproc . . . . . . . . . . . .l near 00000000 flatexternallabel1 . . . . . . . . . . . . .byte 0000005d _datanumber1 . . . . . . . . . . . .dword 00000000 _datanumber2 . . . . . . . . . . . .dword 00000004 _dataoutproc . . . . . . . . . . . .l near 00000000 flatexternalpro

24、mpt1 . . . . . . . . . . . .byte 00000008 _dataprompt2 . . . . . . . . . . . .byte 0000001e _datastring . . . . . . . . . . . . .byte 00000035 _datasum . . . . . . . . . . . . . .byte 0000006a _data 0 warnings 0 errors图1.9 列表文件example.lst7 使用调试软件windbg调试程序1)打开windbg程序输入:windbg或直接在window界面下打开c盘上的文件夹m

25、asm,双击 windbg.exe程序的图标,也可以运行windbg,并看到如图1.10的窗口。 图1.10 windbg打开界面2)打开可执行文件在file菜单中打开“executable”后选择“example.exe”或其他可执行文件,标题栏中增加了example.exe,以及command窗口中还出现一些文字。点击“进入”(step into, f11 or f8)按钮,图标如。 在信息窗口中点击确认后,再点击“进入”按钮,现在源代码就出现在command窗口后面的子窗口中。将command窗口最小化,选择view菜单,然后选择register子菜单,打开一个窗口,用来显示80x86中

26、寄存器的内容。然后选择view菜单下memory子菜单,打开一个窗口用来显示内存的内容,对于该窗口来说,必须输入内存的开始地址。例如,在example.asm中,使用&number1作为开始地址,这是数据段的第一项。最后调整各个窗口的大小,并且重新排列,让屏幕显示看起来和图1.11差不多。3)跟踪调试程序该程序的第一条语句是高亮度显示,点击“进入”按钮,执行这条语句。虽然这是一条宏语句,但可以作为一个单独的指令执行。在输出窗口输出“enter first number:”。再次点击“进入”按钮,执行输入宏语句。当输入一个数字并按回车键后,windbg就回到调试窗口,第三条语句高亮显示。

27、第三次点击“进入”按钮,执行将ascii代码转换为相应的二进制补码的双字的宏指令,并执行第一条mov指令。现在windbg窗口看起来如图1.12所示,输出窗口如图1.13。此时,register窗口显示eax值为00000027,它是39的二进制补码的双字形式。数字39是在提示符下输入的,在memory窗口的第四行可以看到它的ascii码。memory窗口的每一行由三部分组成:该行的起始地址,在这些地址中存储字节的十六进制数,可能的化,还有这些字节相应的可打印字符。图1.11 windbg准备跟踪程序图1.12 windbg跟踪程序图1.13 输入输出窗口1该程序剩余部分同样可以跟踪,图1.1

28、4是程序结束之前的windbg窗口。滚动memory窗口,以便显示由输出标志的那部分内容。此时,输入23作为第二个数字,计算3923的和,将结果以二进制的补码形式存储在eax中,并且由dtoa 宏将计算的和转化为11字节长的字符串。这时,内存中,在数字6(ascii值为36)和数字2(ascii码值为32)之前有10个空格(ascii码值为20)。图1.14 程序结束前的windbg最后的输入窗口如图1.15。图1.15 运行的最后显示结果实验二 顺序程序设计2.1 实验目的与要求2.1.1 实验目的掌握80x86 32位汇编语言程序设计的基本步骤,分析问题,确立算法。根据程序算法流程选择合适

29、的指令编制汇编语言源程序。本实验着重掌握顺序程序设计的基本方法和技巧,熟练使用基本的i/o宏。2.1.2 实验要求(1) 程序要结构化:简明、易读和易调试。(2) 执行速度较快且占用存储空间较少。2.2 示例例2.1 计算矩形面积试编写一程序,根据用户输入的矩形的长和宽,计算该矩形面积并显示结果。要求给出相应的输入输出提示信息。1 分析这一题目的算法流程很简单,首先显示提示信息,等待用户输入数据后,将用户输入的字符串转换为数值并保存,获得矩形的长和宽后,计算矩形的面积(长×宽),最后显示结果。该程序中将使用基本的i/o宏操作,进行输入提示信息和结果的显示使用宏input和output

30、,在用户输入信息与数值之间的转换和面积数值和显示信息之间的转换需要用到宏atod和dtoa,具体使用方法参考附录。2 流程图根据上面的分析,该程序的流程如图2.1。3 寄存器分配情况和变量说明在程序中定义3个提示信息串变量,其中prompt1为输入矩形长的提示信息, prompt2为输入矩形宽的提示信息,answer为输出矩形面积的信息。将回车和换行的ascii码分别定义为cr和lf两个常量。字节变量area保存计算结果。4 运行情况windbg下动态调试和运行例2.1之前的界面如图2.2。运行完例2.1后的dos界面下显示结果如图2.3,寄存器eax、ebx、ecx、edx内的值和数据保留区

31、内容分别如图2.4和图2.5。图2.1 例2.1的流程图图2.2动态调试例2.1前状态 图2.3 例2.1运行情况图2.4 例2.1运行后主要寄存器图2.4例2.1运行后的数据保留区5 例2.1源程序清单;*;功能:计算矩形面积;作者:;日期:;*.386.model flatexitprocess proto near32 stdcall, dwexitcode:dword;-include io.hcr equ 0dh ;回车lf equ 0ah ;换行;-.stack 4096 ;预留4096字节的堆栈;-.data ;数据保留区prompt1 byte "this progr

32、am will find the area of a rectangle",cr,lf,lf byte "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;-.code ;主程序代码开始_start: output prompt1 ;提示输入宽度 inp

33、ut value,16 ;读取ascii字符 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 题目

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

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

36、户输入和显示字符之前都要有相应的提示信息。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 is : 813. 提

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

38、次游戏。1 分析在该程序里面有2个地方需要进行分支设计。第一个分支设计是判断第二人输入的数字是否等于第一人输入的数字,判断结果有三种:大于、小于和等于。其中判断结果为大于和小于就必须等待下一次输入数字;如果结果为等于,则输出猜测次数,并等待用户输入是否继续游戏,也就是进入第二个分支。在第二个分支里面,如果用户输入“y”,程序重新开始一次新游戏,否则退出程序。在这里要确定用哪些跳转指令,在进行分支之前先设计好标号。2 流程图例3.1的流程图见图3.1。图3.1 例3.1的流程图3 寄存器分配情况和变量说明定义几个显示提示信息,分别用于提示游戏是否继续、提示第一人和第二人输入数字和显示第二人每次猜

39、测的结果(大于,等于或小于)和显示猜测最后次数。在图3.1中,count用于记录每次猜测次数,target存放第一人输入的待猜测的目标数,guess存放第二人输入的猜测数。由于count 和guess在每次都要更新,在程序代码中分别用cx寄存器保存count的值,用eax寄存器保存当前输入的guess值。4 运行情况运行情况如图3.2所示。图3.2 例3.1的运行情况5 例3.1源程序清单;*; 猜数字游戏的程序; 作者: ; 日期: ;*.386.model flat;-include io.h;-exitprocess proto near32 stdcall, dwexitcode:dw

40、ord;-cr equ 0dh ; 回车lf equ 0ah ; 换行;-.stack 4096 ; 保留4096字节的堆栈;-.data ; 为数据保留存储空间prompt1 byte cr,lf,lf,"player 1, please enter a number: ", 0target dword ?clear byte 24 dup (lf), 0prompt2 byte cr,lf,"player 2, your guess? ", 0stringin byte 20 dup (?)lowoutput byte "too low&q

41、uot;, cr, lf, 0highoutput byte "too high", cr, lf, 0gotitoutput byte "you got it", cr, lf, 0countlabel byte lf, "number of guesses:"countout byte 6 dup (?)byte cr, lf, lf, lf, "do you want to play again? ",0;-.code ; 开始主程序_start:untildone: output prompt1 ; 要求第

42、一个人输入目标数 input stringin, 20 ; 取数 atod stringin ; 转换为整数 mov target,eax ; 存储目标数 output clear ; 清屏 mov cx, 0 ; 计数为0untilmatch: inc cx ; 递增猜的次数 output prompt2 ; 要求第二人猜数 input stringin, 20 ; 取数 atod stringin ; 转换为整数 cmp eax, target ; 比较所猜的数字和目标数 jne ifless ; 猜的数目标数 ?equal: output gotitoutput ; 显示“答对了” jm

43、p endcompareifless: jnl isgreater ; 猜的数<目标数 ? output lowoutput ; 显示“太小了” jmp endcompareisgreater: output highoutput ; 显示“太大了”endcompare: cmp eax, target ; 比较所猜的数和目标数 jne untilmatch ; 再次询问是否猜的数目标数 itoa countout, cx ; 将count转换为ascii码 output countlabel ; 显示标号,count和提示符 input stringin, 20 ; 取出响应 cmp stringin, 'n' ; 响应“n”? je enduntildone ; 是,则退出 cmp stringin, 'n' ; 响应 = 'n' ? jne untildone ;不是,则重复enduntildone: invoke exitprocess, 0 ; 退出,返回代码0public _start ; 公开代码入口点end ; 结束;*3.3 实验题实验3.1 分类统计字符个数1 题目:分类统计字符个数count_char2 实验要求:程序接收用户输入的一行字符

温馨提示

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

评论

0/150

提交评论