《32位汇编语言程序设计》上机指导《32位汇编语言程序设计》上机指导 (1)实验一建立windows环境下32位汇编语言开发环境 (2)实验2 指令格式与寻址方式 (4)实验3 数据操作编程 (5)实验4 分支和循环程序设计 (6)实验5 子程序设计 (8)实验6 输入输出程序设计 (9)实验7:字符串操作 (10)实验8:宏结构设计 (11)实验9:混合编程 (12)Windows环境下32位汇编语言开发环境的建立 (13)调试程序Windbg (19)宏汇编命令ML和连接命令LINK常用参数速查 (22)输入输出宏命令 (23)实验1 建立windows环境下32位汇编语言开发环境实验目的:建立windows环境下32位汇编语言开发环境,并熟悉它的使用方法。
实验要求:(1)建立windows环境下32位汇编语言开发环境;(2)熟悉自己建立的开发环境的使用方法;(3)熟悉调试工具的使用实验内容:(1)定制masm32集成开发环境,使之符合教学要求。
(2)分别建立汇编,连接,和汇编&连接批处理命令,能够生成包含调试信息的目标文件,列表文件,以及能够进行调试的可执行WIN32控制台程序。
(3)建立16位和32位汇编语言框架程序。
(4)在自己建立的开发环境下汇编,连接,运行教材中的例3-1和例3-2。
实验步骤:1、安装开发环境运行《32位汇编语言程序设计》教材配套开发环境软件“开发工具.exe”,将MASM32安装在根目录下(例如:c:\masm32)。
接着运行Exmasm32.exe,将其它软件安装在masm32的目录下(例如:c:\masm32)。
建立masm32文件夹中的qEditor.exe和Windbg.exe桌面快捷方式。
2、定制开发环境修改文件msm32\bin\buildc.bat中的内容,使得执行Project\Console Assemble & Link后能够汇编连接可调试的32位控制台应用程序,同时生成列表文件。
汇编命令改为:\masm32\bin\ml /c /coff /Fl /Zi “%1.asm”连接命令改为:\masm32\bin\link /debug “%1.obj”1、建立汇编连接16位应用程序的批处理文件make16.bat建立汇编连接16位应用程序的批处理文件make16.bat,可以用于汇编连接可调试的实模式应用程序,同时生成列表文件。
make16.bat的主要内容:\masm32\bin\ml /c /Fl /Zi "%1.asm"\masm32\bin\Link16 /debug "%1.obj"4、建立适合在定制开发环境下使用的32位应用程序框架.386 ;必须是第一条非注释语句,说明这是一个32位应用程序.model flat, stdcall ;定义程序的存储模式(32位应用程序中必须采用flat)include \masm32\include\io32.inc ;可选,如果在程序中使用作者自定义的宏命令需要这一句.stack 4096 ;定义堆栈段.data ;定义数据段……;数据定义.code ;定义代码段start: ;程序起始点……;程序代码ret ;程序结束点,返回WINDOWS……;子程序代码end start ;汇编结束5、建立适合在定制开发环境下使用的32位应用程序框架.model small, stdcall;定义程序的存储模式(一般采用small).386 ;可选,如果有该语句,可以使用386指令集include \masm32\include\io16.inc ;可选,如果在程序中使用作者自定义的宏命令需要这一句.stack ;定义堆栈段.data ;定义数据段……;数据定义.code ;定义代码段.startup: ;程序起始点……;程序代码.exit 0 ;程序结束点,返回DOS……;子程序代码end ;汇编结束4、在自己建立的开发环境下汇编,连接,运行教材中的例3-1和例3-2。
实验2 指令格式与寻址方式实验目的:熟悉汇编语言指令格式,掌握常用数据定义伪指令,理解各种寻址方式的应用。
掌握调试工具Windbg.exe的使用。
实验要求:(1)通过调试程序理解常用数据定义伪指令的作用。
(2)通过调试程序理解各种寻址方式的应用。
(3)熟练掌握调试工具Windbg的使用方法。
实验内容:(1)上机汇编连接例3-4--例3-9,通过列表文件和windbg察看数据在内存中的分配情况。
(2)上机汇编连接例4-1--例4-9,通过windbg察看机器码,并单步执行,观察每一条指令的执行结果。
实验步骤:1、上机汇编连接例3-4(1)查看列表文件。
根据列表文件画出数据段中数据的分配情况,同时标出const1和const2的内存单元。
(2)用Windbg调试例3-4。
用memory窗口察看const1开始的29个字节空间的内容,并记录下来。
(3)对比源程序中的数据定义,列表文件的数据分配和在Windbg中记录的数据,理解数据定义伪指令的作用。
2、按照上题的要求,上机汇编连接例3-5—例3-9。
3、上机汇编连接例4-1(1)用Windbg调试例4-1,用Disassembly窗口察看机器码。
指出指令的中操作数。
(2)在Windbg下单步执行例4-1,观察eax寄存器的内容变化情况。
4、按照上题的要求,上机汇编连接例4-2—例4-7。
5、上机汇编连接例4-8(1)用Windbg调试例4-8,用Disassembly窗口察看机器码(2)在Windbg下单步执行例4-8,观察EIP寄存器内容的变化情况。
(3)分析指令jmp start的机器码的含义。
观察这条指令执行前后EIP寄存器内容的变化。
6、上机汇编连接例4-9(1)用Windbg调试例4-9,用Disassembly窗口察看机器码(2)在Windbg下单步执行例4-9,观察EIP寄存器内容的变化情况。
(3)察看内存address的内容,观察它与地址quit的关系。
(4)观察指令jmp address执行前后EIP寄存器内容的变化。
实验3 数据操作编程实验目的:熟练掌握基本的数据传送指令,算术运算指令和位操作指令在编程中的应用。
实验要求:按照要求编写程序,调试运行。
实验内容:1、编写32位控制台应用程序提示用户输入32位有符号整数x, y, z,计算result=x-2y+4z的值,并显示计算结果。
调用WriteString显示字符串“Input 32-bit signed integer x:”;调用ReadSDecDword输入数据保存到x;调用WriteString显示字符串“Input 32-bit signed integer y:”;调用ReadSDecDword输入数据保存到yy=y+y;result=x-y;调用WriteString显示字符串“Input 32-bit signed integer z:”;调用ReadSDecDword输入数据保存到z;z=4*zresult=result+z;调用WriteString显示字符串“x-2y+4z=:”;调用WriteSDecDword显示result.2、写32位控制台应用程序:提示用户输入长方形的长和宽,计算它的周长和面积,并分别显示结果。
调用WriteString显示字符串“Input length of rectangle x:”;调用ReadUDecDword输入数据保存到x;调用WriteString显示字符串“Input width of rectangle y:”;调用ReadUDecDword输入数据保存到y;周长=x+y;面积=x*y;调用WriteString显示字符串“detmer of rectangle is:”;调用WriteUDecDword显示周长;调用WriteString显示字符串“area of rectangle is:”;调用WriteUDecDword显示面积;3、编写32位控制台应用程序:分解AX寄存器的内容:取高7位存入value1,取中间5位存入value2,取最后4位存入value3。
提示:使用移位和逻辑运算指令实现。
4、编写32位控制台应用程序:将value1的低7位,value2的低5位,value3的低4位合并到AX寄存器中。
提示:使用双精度移位指令。
5、编写32位控制台应用程序:利用作者提供的输入输出宏从键盘接收一个字节的十进制数,利用教材中例题5-47的代码,将这个十进制数转换成十六进制字符存放到HexStr 中,用输出字符串宏WriteString显示转换的结果。
实验4 分支和循环程序设计实验目的:熟练掌握分支和循环结构的设计方法,熟悉跳转和循环指令的使用方法。
实验要求:按照要求编写程序,调试运行。
实验内容:1、编写程序实现下面的算法:ifthenlowerCount+1;elseif(ch≥’A’) and (ch≤’Z’)thenupperCount+1elseotherCount+1;endifendif其中ch调用ReadChar输入,lowerCount, upperCount和otherCount的值用WriteUDecByte显示。
2、编写程序从键盘输入一系列有符号数,找出其中的最大数和最小数,显示运行结果。
建议算法如下:显示“First number?”;调用ReadSDecDword输入双字有符号数;minimum:=number;maximum:=number;while(显示“Another number?(Y or N)”)loopif (输入Y) then调用ReadSDecDword输入双字有符号数;if(number<minimum)thenminimum:=number;endifif(number>maximum)thenmaximum:=number;endifendwhile3-6题中任选一题:3、编写程序将EAX的内容转换为二进制字符串4、编写程序将EAX的内容转换为十六进制字符串5、编写程序将EAX的内容转换为无符号十进制字符串6、编写程序将EAX的内容转换为有符号十进制字符串,负数字符串以“-“引导。
7-10题中任选一题:7、编写程序将二进制字符串表示的数据存入EAX寄存器8、编写程序将十六进制字符串表示的数据存入EAX寄存器9、编写程序将十进制字符串表示的无符号数据存入EAX寄存器10、编写程序将十进制字符串表示的有符号数据存入EAX寄存器实验5 子程序设计实验目的:理解堆栈的工作原理,熟练掌握子程序的设计方法,熟悉子程序相关指令的使用方法。