汇编语言实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验1查看CPU和内存,用机器指令和汇编指令编程1.预备知识:Debug的使用2.实验任务(第45页)(1)已跟踪执行(2)(3)通过DEBUG中的D命令查看到主板的生产日期[以月、日、年,分隔符为'/'的格式]存储在内存ffff:0005~ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有‘只读’属性。(4)通过向内存中的显存写入数据,使计算机根据写入的数据进行ASCII转换,并将转换后且可打印的字符输出到屏幕上。(5)实验2用机器指令和汇编指令编程1.预备知识:Debug的使用2.实验任务(第71页)(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。从第一空开始依次如下:ax=5BEAax=5CCAbx=30F0bx=6022sp=FE220FE5CCAsp=FC220FC6022sp=FE6022sp=100H5CCAsp=FE220FE30F0sp=FC220FC2F32说明:此题可能因机子软、硬件环境不同而导致答案不一致!(2)仔细观察图3.19的实验过程,然后分析:为什么2000:0~2000:f中的内容会发生改变?答:因为用T指令进行调试时,会产生中断。而为了保护现场,CPU则先将标志寄存器进栈、再把当前CS的值进栈,最后将IP的值进栈。实验三汇编语言程序的调试与运行1.将下面的程序保存为t1.asm文件,生成可执行文件t1.exe;assumecs:codesgcodesgsegmentmovax,2000hmovss,axmovsp,0addsp,4popaxpopbxpushaxpushbxpopaxpopbxmovax,4c00hint21hcodesgendsend2.用Debug跟踪t1.exe的执行过程,写出每一步执行后相关寄存器中的内容3.PSP的前两个字节是CD20,用Debug加载t1.exe,查看PSP的内容程序段前缀PSP格式:偏移字节数说明000002中断20H000202以节计算的内存大小(利用这个可看出是否感染引导型病毒)000401保留000505至DOS的长调用000A02INT22H入口IP000C02INT22H入口CS000E02INT23H入口IP001002INT23H入口CS001202INT24H入口IP001402INT24H入口CS001602父进程的PSP段值(可测知是否被跟踪)001814存放20个SOFT号002C02环境块段地址(从中可获知执行的程序名)002E04存放用户栈地址指针00321E保留005003DOS调用(INT21H/RETF)005302保留005507扩展的FCB头005C10格式化的FCB1006C10格式化的FCB2007C04保留008080命令行参数长度(不包含总为最后的0D)及参数也是程序运行期间缺省的DTA实验四[bx]和loop指令的联合使用1.编程:向内存0:200~0:23F依次传送数据0~63assumecs:codecodesegmentmovax,0020hmovds,axmovbx,0movdl,0movcx,40hs:mov[bx],dlincbxincdlloopsmovax,4c00hint21hcodeendsend2.编程:向内存0:200~0:23F依次传送数据0~63,程序中只能使用9条指令(包括程序的2条返回语句)assumecs:codecodesegmentmovax,0020hmovds,axmovbl,0movcx,64s:mov[bx],blincblloopsmovax,4c00hint21hcodeendsend3.下面程序的功能是将“movax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。assumecs:codecodesegmentmovax,code//或者是csmovds,axmovax,0020hmoves,axmovbx,0movcx,18hs:moval,[bx]moves:[bx],alincbxloopsmovax,4c00hint21hcodeendsend注意事项:1.因为要复制的数据是代码段的一部分指令,那么要复制的数据的段地址就和代码段的段地址相同。2.因为要复制的数据是代码段的一部分指令,所以要复制的数据的长度,就是要复制的指令的长度,可以先假设要复制8位[1h~0ffh]数据的字节数(如:10h),把程序补全,以便通过编译。将程序补充完整并将其编译、连接、运行,接着进行DEBUG,在DEBUG时我们可以算出该程序的长度。然后得到正确的值后重新将程序补充完整。(1)复制的是什么?从哪里到哪里?答:复制的是代码的二进制数据,从CS:0到ES:0。(2)复制的是什么?有多少个字节?你如何知道要复制的字节的数量?答:复制的是代码的二进制数据,有CX个字节,因为CX存放的是程序的长度。实验五编写、调试具有多个段的程序1.将下面的程序编译链接,用Debug加载、跟踪,然后回答问题:assumecs:code,ds:data,ss:stackdatasegmentdw0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hdataendsstacksegmentdw0,0,0,0,0,0,0,0stackendscodesegmentstart:movax,stackmovss,axmovsp,16movax,datamovds,axpushds:[0]pushds:[2]popds:[2]popds:[0]movax,4c00hint21hcodeendsendstart①CPU执行程序,程序返回前,data段中的数据均不变.②CPU执行程序,程序返回前,cs=__2933___、ss=_2931___、ds=__2921___.③该程序加载后,code段的段地址为X,则data段的段地址为___X-2_____,stack段的段地址为__X-1___。2.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题:assumecs:code,ds:data,ss:stackdatasegmentdw0123H,0456Hdataendsstacksegmentdw0,0stackendscodesegmentstart:movax,stackmovss,axmovsp,16movax,datamovds,axpushds:[0]pushds:[2]popds:[2]popds:[0]movax,4c00hint21hcodeendsendstart①CPU执行程序,程序返回前,data段中的数据均不变.②CPU执行程序,程序返回前,cs=__2933__、ss=___2931__、ds=__2921___.③该程序加载后,code段的段地址为X,则data段的段地址为__X-2___,stack段的段地址为___X-1_____。④对于如下定义的段:namesegment………nameends如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为((N+15)/16)*16_。④解析:N分为被16整除和不被16整除。当N被16整除时:占有的空间为(N/16)*16当N不被16整除时:占有的空间为(N/16+1)*16,N/16得出的是可以整除的部分,还有一个余数,余数肯定小于16,加上一个16。程序加载后分配空间是以16个字节为单位的,也就是说如果不足16个字节的也分配16个字节。两种情况总结成一个通用的公式:((N+15)/16)*163.将下面的程序编译连接,用Debug加载、跟踪,然后回答问题:assumecs:code,ds:data,ss:stackcodesegmentstart:movax,stackmovss,axmovsp,16movax,datamovds,axpushds:[0]pushds:[2]popds:[2]popds:[0]movax,4c00hint21hcodeendsdatasegmentdw0123H,0456Hdataendsstacksegmentdw0,0stackendsendstart①CPU执行程序,程序返回前,data段中的数据均不变.②CPU执行程序,程序返回前,cs=__2931___、ss=__2934___、ds=__2935____.③设程序加载后,code段的段地址为X,则data段的段地址为___X+3_____,stack段的段地址为___X+4____。4.若将1,2,3题中的最后一条伪指令“endstart“改为“end”,则那个程序仍然可以正确执行?请说明原因。答:这三条程序仍然可以正确执行,只是不知道入口位置.如果不指明入口位置,则程序从所分配的空间开始执行,前2个是数据段,只有从第3条开始是指令代码。5.程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。assumecs:codeasegmentdb1,2,3,4,5,6,7,8aendsbsegmentdb1,2,3,4,5,6,7,8bendscsegmentdb0,0,0,0,0,0,0,0cendscodesegmentstart:movax,amovds,axmovax,bmoves,bmovbx,0movcx,8s:moval,[bx]addes:[bx],alincbxloopsmovax,cmovds,axmovbx,0movcx,8s0:moval,es:[bx]mov[bx],alincbxloops0movax,4c00hint21hcodeendsendstart一次循环版:movax,amovds,ax;ds指向a段地址movax,bmoves,ax;es指向b段地址movbx,0movcx,8s:moval,[bx]addal,es:[bx]movdx,cmovds,dx;ds指向c段地址mov[bx],almovax,amovds,ax;重新将ds指向a段incbxloops一次循环版(改进版):;利用堆栈movax,amovds,axmovax,bmoves,axmovax,cmovss,axmovbx,0movcx,8s:movax,[bx]movss:[bx],axmovax,es:[bx]addss:[bx],axincbxloops6.程序如下,编写code段中的代码,用push指令将a段中的word数据,逆序存储到b段中。assumecs:codeasegmentdw1,2,3,4,5,6,7,8aendsbsegmentdw0,0,0,0,0,0,0,0bendscodesegmentstart:movax,amovds,axmovbx,bmovss,bxmovsp,16movbx,0movcx,8s:push[bx]addbx,2loopsmovax,4c00hint21hcodeendsendstart实验六不同寻址方式的灵活应用1.将课程上所有讲解过的程序上机调试,用debug跟踪其执行过程,并在过程中进一步理解所讲内容.程序7.1assumecs:code,ds:datadatasegmentdb'unIX'db'foRK';共定义8个字节,但程序的运行位置仍在16字节之后dataendscodesegmentstart:moval,'a'movbl,'b'movax,4c00hint21hcodeendsendstart程序7.1.1将第一个字符串转换为大写,将第二个字符串转换为小写assumecs:codesg,ds:datasgdatasgsegmentdb'BaSiC'db'iNfOrMaTiOn'datasgendscodesgsegmentstart:movax,datasgmovds,ax;设置ds指向datasg段movbx,0;设置bx=0,ds:bx指向'BaSiC'

1 / 70
下载文档,编辑使用

©2015-2020 m.111doc.com 三一刀客.

备案号:赣ICP备18015867号-1 客服联系 QQ:2149211541

×
保存成功