32位汇编语言程序设计上机指导.docx
- 文档编号:12770628
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:30
- 大小:88.83KB
32位汇编语言程序设计上机指导.docx
《32位汇编语言程序设计上机指导.docx》由会员分享,可在线阅读,更多相关《32位汇编语言程序设计上机指导.docx(30页珍藏版)》请在冰点文库上搜索。
32位汇编语言程序设计上机指导
《32位汇编语言程序设计》上机指导
实验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\ConsoleAssemble&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位应用程序
.modelflat,stdcall;定义程序的存储模式(32位应用程序中必须采用flat)
include\masm32\include\io32.inc;可选,如果在程序中使用作者自定义的宏命令需要这一句
.stack4096;定义堆栈段
.data;定义数据段
……;数据定义
.code;定义代码段
start:
;程序起始点
……;程序代码
ret;程序结束点,返回WINDOWS
……;子程序代码
endstart;汇编结束
5、建立适合在定制开发环境下使用的32位应用程序框架
.modelsmall,stdcall;定义程序的存储模式(一般采用small)
.386;可选,如果有该语句,可以使用386指令集
include\masm32\include\io16.inc;可选,如果在程序中使用作者自定义的宏命令需要这一句
.stack;定义堆栈段
.data;定义数据段
……;数据定义
.code;定义代码段
.startup:
;程序起始点
……;程序代码
.exit0;程序结束点,返回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)分析指令jmpstart的机器码的含义。
观察这条指令执行前后EIP寄存器内容的变化。
6、上机汇编连接例4-9
(1)用Windbg调试例4-9,用Disassembly窗口察看机器码
(2)在Windbg下单步执行例4-9,观察EIP寄存器内容的变化情况。
(3)察看内存address的内容,观察它与地址quit的关系。
(4)观察指令jmpaddress执行前后EIP寄存器内容的变化。
实验3数据操作编程
实验目的:
熟练掌握基本的数据传送指令,算术运算指令和位操作指令在编程中的应用。
实验要求:
按照要求编写程序,调试运行。
实验内容:
1、编写32位控制台应用程序提示用户输入32位有符号整数x,y,z,计算result=x-2y+4z的值,并显示计算结果。
调用WriteString显示字符串“Input32-bitsignedintegerx:
”;
调用ReadSDecDword输入数据保存到x;
调用WriteString显示字符串“Input32-bitsignedintegery:
”;
调用ReadSDecDword输入数据保存到y
y=y+y;
result=x-y;
调用WriteString显示字符串“Input32-bitsignedintegerz:
”;
调用ReadSDecDword输入数据保存到z;
z=4*z
result=result+z;
调用WriteString显示字符串“x-2y+4z=:
”;
调用WriteSDecDword显示result.
2、写32位控制台应用程序:
提示用户输入长方形的长和宽,计算它的周长和面积,并分别显示结果。
调用WriteString显示字符串“Inputlengthofrectanglex:
”;
调用ReadUDecDword输入数据保存到x;
调用WriteString显示字符串“Inputwidthofrectangley:
”;
调用ReadUDecDword输入数据保存到y;
周长=x+y;
面积=x*y;
调用WriteString显示字符串“detmerofrectangleis:
”;
调用WriteUDecDword显示周长;
调用WriteString显示字符串“areaofrectangleis:
”;
调用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、编写程序实现下面的算法:
if
then
lowerCount+1;
else
if(ch≥’A’)and(ch≤’Z’)
then
upperCount+1
else
otherCount+1;
endif
endif
其中ch调用ReadChar输入,lowerCount,upperCount和otherCount的值用WriteUDecByte显示。
2、编写程序从键盘输入一系列有符号数,找出其中的最大数和最小数,显示运行结果。
建议算法如下:
显示“Firstnumber?
”;
调用ReadSDecDword输入双字有符号数;
minimum:
=number;
maximum:
=number;
while(显示“Anothernumber?
(YorN)”)loop
if(输入Y)then
调用ReadSDecDword输入双字有符号数;
if(number then minimum: =number; endif if(number>maximum) then maximum: =number; endif endwhile 3-6题中任选一题: 3、编写程序将EAX的内容转换为二进制字符串 4、编写程序将EAX的内容转换为十六进制字符串 5、编写程序将EAX的内容转换为无符号十进制字符串 6、编写程序将EAX的内容转换为有符号十进制字符串,负数字符串以“-“引导。 7-10题中任选一题: 7、编写程序将二进制字符串表示的数据存入EAX寄存器 8、编写程序将十六进制字符串表示的数据存入EAX寄存器 9、编写程序将十进制字符串表示的无符号数据存入EAX寄存器 10、编写程序将十进制字符串表示的有符号数据存入EAX寄存器 实验5子程序设计 实验目的: 理解堆栈的工作原理,熟练掌握子程序的设计方法,熟悉子程序相关指令的使用方法。 实验要求: 按照要求编写程序,调试运行。 实验内容: 1、上机调试下面的代码,单步执行,观察ESP寄存器和EIP寄存器内容的变化情况。 观察esp指示的内存单元的内容。 画出堆栈的变化过程,标注ESP寄存器的变化情况。 .386;必须是第一条非注释语句,说明这是一个32位应用程序 .modelflat,stdcall;定义程序的存储模式(32位应用程序中必须采用flat) .code;定义代码段 start: ;程序起始点 push100 callsubproc;程序代码 popeax ret;程序结束点,返回WINDOWS subprocproc ret subprocendp endstart;汇编结束 2、编写完整的32位应用程序: 设计子程序完成下面的功能,在主程序中先调用ReadUDec输入数据,然后调用自己编写的子程序,将输入的数据转换为对应的可显示字符串的形式,最后调用WriteString显示转换后的字符串。 要求完成的子程序可以在 (1)-(4)中任选一题,(5)-(8)中任选一题。 (1)编写子程序将EAX的内容转换为二进制字符串 (2)编写子程序将双字补码转换为十六进制字符串 (3)编写子程序将EAX的内容转换为无符号十进制字符串 (4)编写子程序将双字补码转换为有符号十进制字符串,负数字符串以“-“引导。 (5)编写子程序将二进制字符串表示的数据存入EAX寄存器 (6)编写子程序将十六进制字符串表示的数据存入EAX寄存器 (7)编写子程序将十进制字符串表示的无符号数据存入EAX寄存器 (8)编写子程序将十进制字符串表示的有符号数据存入EAX寄存器 3、利用多模块设计方法实现上面程序的功能,建立子程序库,并编写主程序调用子程序库中的函数。 提示: (1)编写子程序模块完成上题中的子程序功能,汇编生成目标文件。 (2)将子程序目标文件组成库文件: \masm32\bin\lib目标文件名/out: 库文件名 或者\masm32\bin\link-lib目标文件名/out: 库文件名 (3)编写主程序模块: 用extern声明外部子程序,用includelib包含前面生成的库文件,在主程序中先调用ReadUDec输入数据,然后调用自己编写的子程序,将输入的数据转换为对应的可显示字符串的形式,最后调用WriteString显示转换后的字符串。 汇编连接生成可执行文件。 实验6输入输出程序设计 实验目的: 熟练掌握实现实模式和保护模式下键盘输入和屏幕显示功能的程序设计方法。 实验要求: 按照要求编写程序,调试运行。 实验内容: 1、编写实模式应用程序: 利用IN/OUT指令读写CMOS时钟,显示当前的日期和时间。 2、编写实模式应用程序: 利用IN/OUT指令编写简单的音乐程序。 运行时,当用户按下按键1-7,分别演奏音调dou,re,mi,fa,so,la,si 3、编写完整的16位应用程序: 设计子程序完成下面的功能,在主程序中先调用输入字符串的子程序,将字符串中所有英文字符变为大写,其他字符不变。 最后调用输出字符串的子程序,显示原始字符串和转换后的字符串。 (1)编写实模式子程序利用系统调用完成键盘输入一个字符。 (2)编写实模式子程序利用系统调用完成屏幕显示一个字符。 (3)编写实模式子程序利用系统调用完成键盘输入一个字符串。 (4)编写实模式子程序利用系统调用完成屏幕显示一个字符串。 4、编写完整的32位应用程序: 设计子程序完成下面的功能,在主程序中先调用输入字符串的子程序,将字符串中的字符逆序排序生成新的字符串。 最后调用输出字符串的子程序,显示原始字符串和转换后的字符串。 编写保护模式子程序利用系统调用完成键盘输入一个字符。 (1)编写保护模式子程序利用系统调用完成键盘输入一个字符。 (2)编写保护模式子程序利用系统调用完成屏幕显示一个字符。 (3)编写保护模式子程序利用系统调用完成键盘输入一个字符串。 (4)编写保护模式子程序利用系统调用完成屏幕显示一个字符串。 实验7: 字符串操作 实验目的: 熟练掌握串操作指令的使用方法。 实验要求: 本实验要求利用串操作指令,根据要求编写程序,调试运行。 输入输出功能可以使用作者定义的命令,也可以使用读者自己定义的子程序来实现。 实验内容: 1、编写32位应用程序逆序拷贝字符串。 程序运行时首先显示原来的字符串,然后显示逆序排列后的字符串。 2、编写32位应用程序: 连接两个字符串。 首先提示用户输入两个字符串,然后连接两个字符串,并在两个字符串之间插入字符”.”。 显示原始字符串和连接后的字符串。 3、编写32位应用程序加密字符串。 首先提示用户输入一个字符串,然后用加密算法对字符进行变换,显示加密后的字符串。 再运行解密算法得到原始的字符串,显示解密后的字符串。 加密算法: 字符异或密钥 解密算法: 加密字符异或密钥 密钥是8位无符号数。 实验8: 宏结构设计 实验目的: 熟练宏的使用方法。 实验要求: 按照要求编写程序,调试运行。 实验内容: 1、编写完整的32位应用程序: 先定义下面的宏,然后在程序中调用宏,生成列表文件。 根据列表文件写出宏扩展后的结果。 (1)定义Move32宏接收两个内存操作数,把源操作数送到目的操作数。 (2)定义Mult32宏接收两个内存操作数,将他们相乘产生一个32位的乘积。 2、编写一个ReadUdec的宏,从标准输入上读取一个8位,16位或32位的无符号整数,并在给定的参数中返回。 使用条件操作符允许宏能够处理不同大小的输入参数。 写一个程序调用宏并传递不同尺寸的操作数。 3、编写一个WriteUdec的宏,通过调用显示无符号数的功能在标准输出上显示一个无符号数。 传递给宏的参数可以是一个字节、字或双字,在宏内使用条件操作符以便能适应不同尺寸的参数。 写一个程序调用宏,并传递给宏不同尺寸的参数。 实验9: 混合编程 实验目的: 熟练掌握汇编语言与VC++的混合编程的方法。 实验要求: 按照要求编写程序,调试运行。 实验内容: 1、编写一个C++程序通过调用汇编子程序实现的功能。 提示: 在C程序中输入两个整数,然后调用汇编子程序对这两个数求积,在主程序中打印计算结果。 编程并上机调试通过。 2、编写程序,在汇编程序中初始化varA=12、varB=6,调用C语言的子程序求积并打印计算结果。 编程并上机调试通过。 3、将排序子程序改写成C语言的嵌入式汇编函数;然后编写一个C语言主程序,提供待排序的数据和显示排序后的结果。 4、将排序子程序改写成可供C语言调用的模块;然后编写一个C语言主程序,提供待排序的数据和显示排序后的结果。 5、编写识别CPU的汇编语言过程,供VisualC++6.0调用的形式,然后编写一个VisualC++主程序,并上机调试通过。 Windows环境下32位汇编语言开发环境的建立 在Windows环境下进行汇编语言程序设计之前,首先需要搭建一个汇编语言的开发环境。 现在汇编语言开发工具包常见的是MASM,TASM和NASM。 MASM是微软开发的宏汇编工具,适合在Windows环境下进行程序设计,性能稳定,持续升级;NASM的语法与MASM略有不同,它可以在不同的环境下使用,LINUX或Windows。 鉴于目前汇编语言程序设计教学中更多的选择了MASM,本文将介绍基于MASM的32位汇编开发环境的几种搭建方法。 其他汇编工具的具体内容可参考相关的手册。 汇编语言的开发分为源代码编辑,汇编和连接三个步骤,在必要的时候还需要对程序进行调试。 因此汇编语言开发环境中应包含编辑软件,汇编软件,连接软件和调试软件。 如果将这些软件集成在一起就是构成一个集成开发环境。 一、命令行环境 首先下载一个MASM615开发工具包。 在许多汇编网站和汇编教材的配套光盘中都提供了该工具包。 根据提示,进行安装。 然后就可以用它来开发汇编程序。 (1)源代码编辑 汇编源程序是纯文本文件,其扩展名为.asm,可以用任何一种文本编辑软件来编写汇编原代码。 比如EditPlus,UltraEdit,NotePad,Word,VC++等,注意文件保存的时候必须以纯文本格式保存,并取.asm后缀名。 (2)汇编 源文件不能直接被机器执行,需要运行汇编软件对它进行汇编生成目标文件,后缀为.obj.,这是一个二进制文件。 如果出现语法错误,汇编程序会产生错误报告,程序员可以根据这些错误报告对源程序进行重新编辑,重新汇编,直到没有语法错误为止。 MASM汇编器的命令是ml.exe,其命令行格式为: Ml[/option]源文件[/linkoption] 生成32位应用程序时,常用的命令行是: ML/coff/c/Fl/Zifilename; 例如,要汇编test.asm源文件,生成coff格式的目标文件,列表文件和调试信息,可以使用命令行: ML/coff/c/Fl/Zitest.asm; 为了避免每次汇编源文件的时候都要输入许多参数,可以建立一个批处理文件。 例如批处理文件mlbat.bat @echooff ifexist"%1.obj"del"%1.obj" ifexist"%1.exe"del"%1.exe" path\ml/c/coff/Fl/Zi"%1.asm" iferrorlevel1gotoerrasm : errasm echo_ echoAssemblyError gotoTheEnd : TheEnd pause 有了这个批处理文件以后,如果汇编test.asm,就可以用命令: mlbattest 在建立自己批处理文件的时候,可以根据需要设定参数,指定路径。 (3)连接 目标文件仍然不能执行,还需要运行连接程序,将目标文件和库文件连接起来,才能生成最后可以执行的.exe文件。 生成可执行文件的工具叫做连接器。 在前面提到的汇编语言开发工具包中都包含有连接器link.需要注意的是,连接器有两种: 一种是16位连接器(SegmentedExecutableLinker),用于生成DOS程序,一种是32位连接器,可以生成Win32PE文件(IncrementalLinker),如果要生成32位应用程序需要使用后者。 在MASM8和VC中提供有32位连接程序。 一般来说,在开发工具包中用link16和link32分别表示16位和32位连接软件。 连接器的命令行用法为: LINK[option]filename 生成windows控制台程序的常用命令是: LINK/subsystem: console/DEBUGfilename 生成windows程序的常用命令是: LINK/subsystem: windows/DEBUGfilename 参数/DEBUG是为方便调试而设置的。 例如,将前面生成的目标文件test.obj连接生成控制台程序test.exe所用的命令行是: LINK/subsystem: console/DEBUGtest.obj 为了避免每次连接的时候都要输入许多参数,同样也可以建立一个批处理文件。 例如批处理文件linkbat.bat @echooff ifnotexist“%1.obj”gotoerrlink path\Link/SUBSYSTEM: CONSOLE/OPT: NOREF/DEBUG"%1.obj" iferrorlevel1gotoerrlink : errlink echo_ echolinkError gotoTheEnd : TheEnd pause 此时,对test.obj连接,可以用命令: linkbattest 在建立自己批处理文件的时候,可以根据需要设定参数,指定路径。 如果建立一个类似VC里build的命令,就可以执行一个命令对原程序进行汇编和连接。 下面的批处理文件buildc.bat执行的就是先汇编再连接的功能: REMbuildc.bat @echooff ifexist"%1.obj"del"%1.obj" ifexist"%1.exe"del"%1.exe" path\ml/c/coff"%1.asm" iferrorlevel1gotoerrasm path\Link/SUBSYSTEM: CONSOLE/OPT: NOREF"%1.obj" iferrorlevel1gotoerrlink dir"%1.*" gotoTheEnd : errlink echo_ echoLinkerror gotoTheEnd : errasm echo_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 32 汇编语言 程序设计 上机 指导