汇编上机指导Word文档下载推荐.docx
《汇编上机指导Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《汇编上机指导Word文档下载推荐.docx(23页珍藏版)》请在冰豆网上搜索。
![汇编上机指导Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-1/26/568ae899-45b3-4e4f-b324-f936c3febdf2/568ae899-45b3-4e4f-b324-f936c3febdf21.gif)
连接命令改为:
\masm32\bin\link/debug“%1.obj”
2、在定制后的masm32开发环境中运行教材中的例题fig3-1.
3、利用教材提供的80x86/software在命令行方式下运行例题fig3-1.
4、建立适合在定制开发环境下使用的32位应用程序框架
参考:
.386;
必须是第一条非注释语句,说明这是一个32位应用程序
.modelflat,stdcall;
定义程序的存储模式(32位应用程序中必须采用flat)
include\masm32\include\io32.inc;
可选,如果在程序中使用作者自定义的宏命令需要这一句
.stack4096;
定义堆栈段
.data;
定义数据段
……;
数据定义
.code;
定义代码段
start:
;
程序起始点
程序代码
ret;
程序结束点,返回WINDOWS
子程序代码
endstart;
汇编结束
5、在自己建立的开发环境下实现教材中P59.ProgrammingExercises3.3中第3题。
完成实验报告。
在实验报告中完成下列内容:
(1)写出你自己的32位应用程序框架,并说明如何汇编,连接生成可执行文件。
(2)写出实验步骤5中程序的完整源代码。
实验2InstructionFormatandAddressingMode
熟悉汇编语言指令格式,掌握常用数据定义伪指令,理解各种寻址方式的应用。
掌握调试工具Windbg.exe的使用。
(1)通过调试程序理解常用数据定义伪指令的作用。
(2)通过调试程序理解各种寻址方式的应用。
(3)熟练掌握调试工具Windbg的使用方法。
(1)上机汇编连接fig3-1,生成并观察列表文件;
用调试工具Windbg单步执行程序,观察寄存器和内存的变化。
(2)编写程序完成教材中P72.Exercises3.5。
用Windbg观察内存的分配情况。
1、上机汇编连接fig3.1
(1)查看列表文件。
根据列表文件画出数据段中数据的分配情况。
(2)用Windbg调试fig3-1。
用memory窗口察看prompt1开始的内存空间,并记录下来。
(3)对比源程序中的数据定义,列表文件的数据分配和在Windbg中记录的数据,理解数据定义伪指令的作用。
2、用Windbg调试fig3-1,用Disassembly窗口察看指令的机器码。
3、用Windbg单步执行fig3-1,观察每一条指令的执行结果。
4、上机编写完整的源程序加入教材中P72.Exercises3.5中的数据定义,汇编连接后,用Windbg观察内存分配的情况。
完成实验报告,回答下面的问题:
1、要使程序能在windbg中调试,执行汇编和连接命令时,需要使用什么参数?
2、Fig3-1.exe中执行指令inputstring,40时,用户如果输入”123”,该指令的执行结果是什么?
atodstring指令执行后的结果是什么?
3、写出P72.Exercises3.5中1,3,5,7,10,12,15,17,23,32定义的内存空间的值。
4、写出下列指令的寻址方式和机器码:
(1)addeax,number1
(2)movnumber1,eax
(3)moveax,100
(4)movebx,offsetnumber1
addeax,[ebx]
实验3DataOperationProgramming
熟练掌握基本的数据传送指令,算术运算指令和位操作指令在编程中的应用。
按照要求编写程序,调试运行。
1、完成教材P107.ProgrammingExercises4.2中第2题。
Writeacomplete80x86assemblylanguageprogramtopromptforvaluesofx,y,andzanddisplaythevalueofexpression2(-x+y-1)+z.Allowfor32-bitintegervalues.
2、完成教材P117.ProgrammingExercises4.3中第3题。
Supposethatsomeonehasacertainnumberofcoins(pennies,nickels,dimes,quarters,fifty-centpieces,anddollarcoins)andwantstoknowthetotalvalueofthecoins,aswellashowmanycoinsthereare.Writeaprogramtohelp.
3、完成教材P129.ProgrammingExercises4.4中第4题和第5题。
a)Writeacomplete80x86assemblylanguageprogramtopromptforfourpairsofgradesandweightingfactors.Eachweightingfactorindicateshowmanytimesthecorrespondinggradeistobecountedinthesum.Theweightedsumis:
WeightedSum=Grade1*Weight1+Grade2*Weight2+Grade3*Weight3+Grade4*Weight4andthesumoftheweightis:
SumWeights=Weight1+Weight2+Weight3+Weight4.Displaytheweightedsum,thesumoftheweightsandtheweightedaverage(WeightedSum/SumofWeights).
b)Writeacomplete80x86assemblylanguageprogramtopromptforfourgrades,andthendisplaythesumandtheaverageofthegradesindddddformat.
4、编写代码实现下面的功能:
无符号两位十进制字符串转换为对应的二进制数存入AL
5、编写代码实现下面的功能:
将AL中的数值(0-99)转换为无符号十进制数字符串。
6、编写代码实现下面的功能:
将两位的十六进制字符串(0-9)转换为对应的二进制数存入AL
7、编写代码实现下面的功能:
将AL中的数值转换为对应的两位十六进制字符串。
提交试验内容1-3源程序,完成实验报告。
实验报告中要求写出实现实验内容4,5,6,7的关键代码。
实验4BranchingandLoopProgramming
熟练掌握分支和循环结构的设计方法,熟悉跳转和循环指令的使用方法。
1、编写程序实现下面的算法:
if
then
lowerCount+1;
else
if(ch≥’A’)and(ch≤’Z’)
upperCount+1
otherCount+1;
endif
其中ch调用ReadChar输入,lowerCount,upperCount和otherCount的值用WriteUDecByte显示。
2、编写程序从键盘输入一系列有符号数,找出其中的最大数和最小数,显示运行结果。
建议算法如下:
显示“Firstnumber?
”;
调用ReadSDecDword输入双字有符号数;
minimum:
=number;
maximum:
while(显示“Anothernumber?
(YorN)”)loop
if(输入Y)then
if(number<
minimum)
if(number>
maximum)
endwhile
3-6题中任选一题:
3、编写程序将EAX的内容转换为二进制字符串
4、编写程序将EAX的内容转换为十六进制字符串
5、编写程序将EAX的内容转换为无符号十进制字符串
6、编写程序将EAX的内容转换为有符号十进制字符串,负数字符串以“-“引导。
7-10题中任选一题:
7、编写程序将二进制字符串表示的数据存入EAX寄存器
8、编写程序将十六进制字符串表示的数据存入EAX寄存器
9、编写程序将十进制字符串表示的无符号数据存入EAX寄存器
10、编写程序将十进制字符串表示的有符号数据存入EAX寄存器
提交实验内容1,2的源程序,完成实验报告,实验报告中给出3-6题中任一题的关键代码,7-10题中任意一题的关键代码。
实验5ProcedureProgramming
理解堆栈的工作原理,熟练掌握子程序的设计方法,熟悉子程序相关指令的使用方法。
1、上机调试下面的代码,单步执行,观察ESP寄存器和EIP寄存器内容的变化情况。
观察esp指示的内存单元的内容。
画出堆栈的变化过程,标注ESP寄存器的变化情况。
push100
callsubproc;
popeax
subprocproc
ret
subprocendp
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显示转换后的字符串。
汇编连接生成可执行文件。
提交实验内容3的源程序,并在实验报告中说明子程序库的开发过程,以及可执行程序的执行结果;
实验报告中给出实验内容3中子程序源代码(可以在
(1)-(4)中任选一题,(5)-(8)中任选一题。
)
实验6Input/OutputProgramming
熟练掌握实现实模式和保护模式下键盘输入和屏幕显示功能的程序设计方法。
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)编写保护模式子程序利用系统调用完成屏幕显示一个字符串。
提交第2题源程序;
在实验报告中给出第3(3)和(4)题和第4(3)和(4)题的关键代码。
实验7MacroDesign
熟练宏的使用方法。
1、编写完整的32位应用程序:
先定义下面的宏,然后在程序中调用宏,生成列表文件。
根据列表文件写出宏扩展后的结果。
(1)定义Move32宏接收两个内存操作数,把源操作数送到目的操作数。
(2)定义Mult32宏接收两个内存操作数,将他们相乘产生一个32位的乘积。
2、编写一个ReadUdec的宏,从标准输入上读取一个8位,16位或32位的无符号整数,并在给定的参数中返回。
使用条件操作符允许宏能够处理不同大小的输入参数。
写一个程序调用宏并传递不同尺寸的操作数。
3、编写一个WriteUdec的宏,通过调用显示无符号数的功能在标准输出上显示一个无符号数。
传递给宏的参数可以是一个字节、字或双字,在宏内使用条件操作符以便能适应不同尺寸的参数。
写一个程序调用宏,并传递给宏不同尺寸的参数。
提交1,2,3源程序,在实验报告中写出它们的宏定义方法和宏调用方法。
实验8MixedProgramming
熟练掌握汇编语言与VC++的混合编程的方法。
1.编写一个C++程序通过调用汇编子程序实现的功能。
在C程序中输入两个整数,然后调用汇编子程序对这两个数求积,在主程序中打印计算结果。
编程并上机调试通过。
2.编写程序,在汇编程序中初始化varA=12、varB=6,调用C语言的子程序求积并打印计算结果。
3.将排序子程序改写成C语言的嵌入式汇编函数;
然后编写一个C语言主程序,提供待排序的数据和显示排序后的结果。
4.将排序子程序改写成可供C语言调用的模块;
5.编写识别CPU的汇编语言过程,供VisualC++6.0调用的形式,然后编写一个VisualC++主程序,并上机调试通过。
完成实验报告,在实验报告中写出1,3,4的关键代码,并写出运行结果
附录:
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.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程序的常用命令是:
windows/DEBUGfilename
参数/DEBUG是为方便调试而设置的。
例如,将前面生成的目标文件test.obj连接生成控制台程序test.exe所用的命令行是:
console/DEBUGtest.obj
为了避免每次连接的时候都要输入许多参数,同样也可以建立一个批处理文件。
例如批处理文件linkbat.bat
ifnotexist“%1.obj”gotoerrlink
path\Link/SUBSYSTEM:
CONSOLE/OPT:
NOREF/DEBUG"
iferrorlevel1gotoerrlink
errlink
echolinkError
此时,对test.obj连接,可以用命令:
linkbattest
如果建立一个类似VC里build的命令,就可以执行一个命令对原程序进行汇编和连接。
下面的批处理文件buildc.bat执行的就是先汇编再连接的功能:
REMbuildc.bat
%1