1实验一汇编程序的汇编及运行1.实验目的(1)熟悉汇编程序的汇编、连接、执行过程;(2)生成LST文件,查看LST文件;(3)生成OBJ文件,修改语法错误;(4)生成EXE文件;(5)执行程序。2.实验涉及知识汇编程序从编写到执行的过程编程→.ASM→编译→.OBJ→连接→.EXE→加载→内存中的程序→执行1)编写源程序用EDIT或记事本输入各段,并存储成源程序(保存在MASM目录下),扩展名为ASM。2)对源程序进行汇编、连接操作如下:(1)在DOS状态下,进入MASM目录;(2)输入命令:MASM文件名(连同扩展名);(3)在系统出现的提示中输入:objectfilename[.obj]:按回车键。Sourcelistling[nul.lst]:输入:文件主名,生成lst文件,也可以不生成,直接按回车键。Lst文件用于查看编译为目标文件的过程中产生的中间结果。Cross-reference[nul.crf]:按回车键。(4)如果系统没有提示出错,那么编译过程就完成了。如果提示错误则应用edit打开源文件进行修改,然后再重复2和3步骤(5)输入:link文件主名(不要输扩展名,也可以输入扩展名.obj)runfile[.exe]:按回车键。Listfile[nul.map]:按回车键。Libraries[.lib]:按回车键。(6)没有提示错误,汇编过程就结束了,产生了exe可执行文件。如果出现‘nostrack2segment’的错误警告,不用理会。3)执行程序(由DOS中的COMMAND命令将文件加载入内存)在DOS提示符下直接输入文件主名就可以执行文件了。程序执行后,有的会显示结果,有的可能执行后什么结果都没有,是因为程序中没有显示命令。3.实验内容1)将下面的数据段输入,取名1.ASM,保存在MASM文件夹下。生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?DATASEGMENTORG20HNUM1=9NUM2=NUM1+10HDA1DB'TinkpadPC'DB0AH,0DHCOUNTEQU$-DA1DATAENDSENDCount000CDA1002032)输入下面错误的文件,修改错误语句。(MASM没有出现错误即可。不必连接、运行。)将VAR3DB’ABCDEF’改为VAR3DB'ABCDEF'正确代码:DATASEGMENTVAR1DB0,25,0DH,255VAR2DB12H,04H,6BHVAR3DB'ABCDEF'VAR4DW1234H,5678HVAR5DW10HDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,VAR5MOVBX,OFFSETVAR2MOVAX,0ABHMOV[SI],AXMOVAL,VAR1+24MOVAX,[SI]MOV[BX],AXMOVAX,VAR4MOVVAR5+4,AXMOVAH,4CHINT21HCODEENDSENDSTART3)输入下面程序并运行STACKSSEGMENTSTACKDW128DUP(?)STACKSENDSDATASSEGMENTSTRINGDB‘WELCOME!’,13,10,‘$’DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXLEADX,STRINGMOVAH,9INT21HMOVAH,4CHINT21HCODESENDSENDSTART5修正代码STRINGDB'WELCOME!',13,10,'$'START:MOVAX,DATAS6实验二顺序程序设计1.实验目的(1)学习使用DEBUG的命令;(2)使用DEBUG命令在数据段中查看程序运行的结果;(3)利用DEBUG运行简单的程序段。2.实验内容1)输入程序观察寄存器变化使用DEBUG,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的内容变化。注意用T命令执行时,CS:IP寄存器的内容MOVAX,4E20ADDAX,1416MOVBX,2000ADDAX,BXMOVBX,AXADDAX,BXMOVAX,001AMOVBX,0026ADDAL,BLADDAH,BLADDBH,ALMOVAH,0ADDAL,BLADDAL,9C7IP值在不断增加2)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。如果是将小写字母改成大写字母带注释的语句该如何修改?DSEGSEGMENTMSG1DB‘abc’DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEABX,MSG1MOVCX,3S:MOVAL,[BX]ANDAL,11011111B;将AL中的ASCII码的第5位置0,;变成大写字母。MOV[BX],ALINCBXLOOPSMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART83)程序的跟踪执行操作在DOS下直接输入文件主名就可以执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。那么如何查看程序的运行结果呢?程序执行过程的跟踪操作步骤如下:(1)在DOS下输入:DEBUG文件名.EXE(2)在DEBUG提示符下输入U命令如果程序中有数据段,可以看到反汇编后第一句可执行语句为:A地址:B地址MOVAX,K地址如:1261:0000MOVAX,1260其中:K地址就是数据段的段寄存器内容,A地址为代码段段寄存器地址,B地址为程序第一条指令的偏移地址。(3)可以用T命令单步执行指令,执行到MOVAH,4CH时结束,也可以用G命令执行整个程序,输入:G=B地址(如:G=0000)(4)用D命令查看程序执行后数据段的变化输入:DK地址:0(如:D1260:0)在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。4)输入下面的程序,按实验一和上面的步骤运行一遍。这是一个两个数相与的程序。结果存放在MSG2单元中,偏移地址为?值为多少?DSEGSEGMENTMSG1DW7856H,2038HMSG2DW?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,MSG1ANDAX,MSG1+2MOVMSG2,AXMOVAL,0MOVAH,4CH9INT21HCSEGENDSENDSTART3.编写调试下面的程序,用DEBUG查看数据段中的结果1))/()510*)((YXXWZ++−=,X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。2)X,Y为字节类型数,求16/)2*)(8*)((YXYXZ−−+=,写出完整的数据段和代码段,不用乘除指令。10实验三分支循环程序设计1.实验目的(1)学习调试程序,查找逻辑错误;(2)学习分支语句的编程和调试;(3)学习循环语句的编程和调试。2.实验内容1)有10个数,统计正数的个数,存放在变量M中中。经过汇编后,形成EXE文件。在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发现结果不正确。用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL寄存器中值的变化是否正确?(AL寄存器中存放正数的个数)DSEGSEGMENTMSGDB4,-2,-6,0,5,67,8,-3,5,6MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,10MOVAL,0LEASI,MSGL1:MOVBL,[SI]CMPBL,0JBENEXTINCALNEXT:INCSILOOPL1MOVM,AL11MOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART2)数据段中是一组无符号数,将最小数存放在M单元中。按上题方法查找一处逻辑错误。DSEGSEGMENTMSGDB13,15,7,25,24MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,4MOVAL,MSGMOVSI,OFFSETMSG+1L1:CMPAL,[SI]JBNEXTMOVAL,[SI]NEXT:LOOPL1MOVM,ALMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART3)编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。124)编程:∑−=∗=81iiiBAY,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2开始的连续存储单元中,结果存于REST单元中。13实验四子程序设计1.实验目的(1)学习子程序的编写,主子程序的调用;(2)不同模块间程序的调用和调试。2.实验内容1)数据段中的3个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。DATASEGMENTMAGDB‘ABC’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVCX,3LL:MOVDL,MAG[SI]CALLMADDINCSILOOPLLMOVAH,4CHINT21HMADDPROCMOVAH,02HINT21HRETMADDENDPCODEENDS14ENDSTART2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。具体步骤如下:MASMS31.ASM(分别汇编)MASMS32.ASMLINKS31S32(将两个文件连接成为一个文件名为S31)S31.EXE(运行)3)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。(也可以将找到的不相等字符逐个显示,用INT21H的02功能调用)4)编程:子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。调用子程序将BUF1,BUF2,BUF3中的N全部用Y替代。附源程序:NAMES31.ASM不同模块间的段间调用。从键盘输入2位非压缩BCD数,存入AX寄存器中。为了将其转换为二进制数,编写一个子程序TRAN。显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。输入数据为00时结束。EXTRNDISP:FARCODESEGMENTPARA‘CODE’ASSUMECS:CODESTART:MOVAH,01HINT21HMOVBL,ALINT21HMOVAH,ALMOVAL,BLCMPAX,3030HJEEXITCALLNEARPTRTRAN15CALLFARPTRdispJMPSTARTEXIT:MOVAH,4CHINT21HTRANPROCNEAR;将输入的ASCII码转换成2进制数ANDAX,0F0FH;将ASCII码转换成非压缩BCD码,;高位在AL中MOVBL,AHMOVCL,10DMULCLADDAL,BLRETTRANENDPCODEENDSENDSTARTNAMES32.ASMPUBLICDISPCODE1SEGMENTPARA‘CODE’ASSUMECS:CODE1DISPPROCFARMOVBL,ALMOVBH,00MOVCH,4ROLL:MOVCL,4ROLBX,CLMOVDL,BLANDDL,0FHCMPDL,9JBENEXT1ADDDL,07H16NEXT1:ADDDL,30HMOVAH,02HINT21HDECCHJNZROLLRETDISPENDPC