admin 管理员组文章数量: 1087135
2024年1月12日发(作者:shortfalls怎么读)
汇编语言程序设计实验指导【实验提要】以下列举的10个实验,都是以Intel的8086及后续系列微处理器的指令系统为核心,采用宏汇编工具MASM6.X以及调试工具DEBUG或DEBUG32,针对本教材所述内容进行相关的上机实践。旨在帮助学生加深认识和理解理论教学知识,通过大量的上机实验熟悉8086CPU的指令功能、用途和使用技巧,进而提高汇编语言程序设计的能力。(带*号的为选作内容)实验一调试工具DEBUG的应用实验目的通过实验掌握下列知识:1、8086指令:MOV,ADD,ADC,SUB,SBB,DAA,XCHG的功能;2、DEBUG命令:A,D,E,F,H,R,T,U的使用;3、BCD码、ASCII码及用十六进制数表示二进制码的方法;4、寄存器:AX,BX,CX,DX,FLAGS,IP。内容及步骤注:本次实验可以参照教材上关于DEBUG的叙述内容进行。一、DEBUG命令使用1、开机后,切换到命令提示符窗口下,出现提示符后键入命令DEBUG,进入调试环境,显示提示符'-'。2、用命令F200220'AB'将'AB'的两个ASCII码循环填入内存。注:第一个参数200是当前段的起始偏移地址,第二个参数220是终了偏移地址,第三个参数‘AB’是被填入的数值,若不给出第二个参数则填入128(8行)个字节。3、用命令D200观察内存中的十六进制码及屏幕右边的ASCII字符。4、用命令F23023F12重复上二项实验,观察结果并比较。5、用命令E2将A-E的ASCII码写入地址为200开始的内存单元中,再用D命令观察结果,看键入的十六进制数和ASCII码的对应关系。
汇编语言程序设计实验指导1336、用H命令检查下列各组十六进制数的和与差(补码表示):(1)56H,34H注:输入H(2)23H,45H(3)AB,3045H1234则在下一行显示0046FFDE,即二者的补码和与差。在DEBUG环境下所有数据和地址都是按16进制处理,所以不要加后面的H标志。7、用R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。注:若在DEBUG32环境下用R16和R32命令分别显示16位和32位寄存器内容。8、用R命令将AX,BX内容改写为1050H及23A8H。
汇编语言程序设计134二、8086常用指令练习1、传送指令1)用A命令在内存400H处键入下列内容:-A0400****:0400****:0403****:0406****:0408****:040A****:040C****:040F****:0411-注:****为段寄存器CS的当前值,内容是不一定的,每行命令以回车键结束。2)用U命令检查键入的程序并记录,特别注意左边的机器码与指令的对应关系。-U04003)用T命令逐条运行这些指令,每运行一行指令观察各寄存器及IP的变化情况,并注意标志位的变化情况。-T=0400(注:=400是表示从偏移地址400处开始单步执行)-T-T(不给出地址,则表示接续上一条指令执行)MOVMOVXCHGMOVMOVMOVXCHGAX,1234BX,5678AX,BXAH,10AL,20CX,89ABAX,CX
汇编语言程序设计实验指导135┇2、加减法指令:1)用A命令在内存100H处键入下列内容:MOVMOVADDAH,11AL,22AL,AH
汇编语言程序设计136SUBMOVMOVADDSUBSUBAL,33CX,1234DX,5678CX,DXCX,AXCX,CX2)用U命令检查键入的程序及对应的机器码。3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。
汇编语言程序设计实验指导1373、带进位加减法:1)用A命令在内存200H处键入下列内容,并用U命令检查:MOVMOVMOVMOVADDADCMOVMOVSUBSBBAH,12AL,84CH,56CL,78AL,CLAH,CHDH,A7DL,58DL,7FDH,342)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。
汇编语言程序设计1383)上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。*4、BCD码加减法(选作)1)内容:MOVADDDAA2)要求:用A命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。AL,65AL,16
汇编语言程序设计实验指导139注:相加后AL值本来是7B,经DAA指令调整后变为81,即65和16两个BCD码的和。
汇编语言程序设计140实验二内存操作数及寻址方法实验目的通过实验掌握下列知识:1、DEBUG命令:A,T,D,F,G;2、数据在内存中的存放方式和内存操作数的几种寻址方式;3、汇编指令:INC,DEC,LOOP,INT3的应用;4、汇编语言伪指令:BYTEPTR和WORDPTR的应用。实验内容和步骤一、内存操作数及各种寻址方式使用程序内容:MOVMOVMOVMOVMOVINCMOVDECMOVMOVMOVMOVAX,2000[200],AXBX,210BYTEPTR[BX],50CL,40BX[BX],CLCLSI,5[BX+SI],CL[BX+SI+1],CLWORDPTR[BX+SI+2],1234操作步骤1)用A命令键入上述程序,并用T命令逐条运行。2)每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注意是什么寻址方式。注:D命令显示结果时,双字节数在内存的存放是高地址对应高数据位;指令中出现的BYTEPTR及WORDPTR是因为操作数的宽度必须一致。二、求累加和程序
汇编语言程序设计实验指导141程序内容:MOVMOVXORADDADCINCLOOPINT3操作步骤:1)进入DEBUG环境。2)用命令F200L1040在内存200H-20FH地址处填入一系列值40H。3)用命令A100将上述程序键入到100H开始的内存中。注:LOOP指令用到108H号地址,即为ADD指令的当前地址,构成一个循环。4)用命令G=100执行该程序段,程序运行后停在INT3指令上,此时观察AX寄存器的值为240H,即为9个40H的和。注:INT3指令是一条断点中断指令,程序遇到该指令则停止。5)用T=100命令单步执行,观察IP、CX及AX寄存器的值,分析程序执行过程。BX,200CX,9AX,AXAL,[BX]AH,0BX108;按字节相加;若有进位则到AH中
汇编语言程序设计142实验三数据串传送和查表程序实验目的通过实验掌握下列知识:1、利用简化段定义方法实现程序结构定义;2、利用DOS的21H号中断调用完成输入输出;3、查表法和查表指令XLAT;4、数据串传送指令MOVS及重复前辍REP;5、掌握EQU和DUP伪指令的用法。实验内容及步骤一、利用查表方法显示内存单元的内容1、编辑下列程序:.r1db'ABCDEFGHIJ'.pmovah,9movdx,offsetstr2int21hmovah,1int21hmovbx,offsetstr1subal,30hxlatmovdl,almovah,0;显示对应字符;查STR1表,对应序号的字符ASCII码进入AL;输入待显示的字符序号(0-9);显示STR2字符串的内容,即提示信息;待显示的内存区内容str2db'Pleaseinputthenumberyouwilldisplay:',10,13,'$'
汇编语言程序设计实验指导143End2、程序汇编通过后,在运行过程中输入0-9的任意数字,显示STR1字符串中对应位置的字符。3、在DEBUG环境中,用P命令调试执行该程序,察看AL寄存器的变化情况及结果的输出,分析其执行过程。二、数据串传送程序1、编辑下列程序:.r1db'abcdefghijklmn'lengsequ$-str1str2dblengsdup(?),'$'.pmovax,dsmoves,axcldleasi,str1leadi,str2movcx,lengsrepmovsbmovah,9movdx,0End2、程序汇编通过后,运行程序察看输出结果。3、在DEBUG环境中,用P命令调试执行该程序,察看SI、DI寄存器及相应内存单元的变化情况,分析其执行过程。4、如果把源串的小写字母复制到目标串的同时再修改为对应的大写字母,该怎么修改程序?;显示目标串;串复制;使DS和ES为同一个段;目标串;源串定义
汇编语言程序设计144实验附录编码060708090A0B0C0D0E0F161718191A1B1C1D1E1F字符NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSIDELDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS编码262728292A2B2C2D2E2F363738393A3B3C3D3E3F字符SPACE!“#$%&‘()*+,-./:;<=>?ASCII码表编码464748494A4B4C4D4E4F565758595A5B5C5D5E5F字符@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_编码666768696A6B6C6D6E6F767778797A7B7C7D7E7F字符`abcdefghijklmnopqrstuvwxyz{|}~DEL
汇编语言程序设计实验指导145实验四完整段定义程序实现实验目的1、掌握完整段格式定义的程序设计方法;2、掌握伪指令:SEGMENT、ENDS、ASSUME、END、OFFSET、DUP;3、掌握汇编语言程序中指名程序入口的方法;4、了解用INT21H的4C号功能调用返回系统的方法;5、掌握用MASM、LINK工具进行汇编和链接的过程。实验内容要求程序中实现对键盘输入的字符作如下处理:如果输入的是小写字母则转换成对应的大写字母并显示在屏幕上;如果输入的是大写字母则转换成对应的小写字母并显示在屏幕上;如果输入的是键盘上的Esc键则退出程序执行;按其它任意可显示键,则不作处理,直接显示输出。实验步骤1、编辑下列程序:DATASEGMENT;数据段定义MESSAGEDB'Pleaseinputyourkey!',0DH,0AH,'$'DATAENDSSTACKSEGMENTPARASTACK'STACK';堆栈段定义DB50DUP(?)STACKENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,SS:STACK;分配段寄存器START:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMESSAGEMOVAH,9INT21H;显示提示信息AGAIN:MOVAH,1INT21H;读入一个键盘按键CMPAL,1BH;按的是ESC键(ASCII码为1BH)则退出程序JEEXITCMPAL,61HJBNEXT
汇编语言程序设计146CMPAL,7AHJANEXTSUBAL,20HJMPDISPNEXT:CMPAL,41HJBDISPCMPAL,5AHJADISPADDAL,20HDISP:MOVDL,ALMOVAH,2INT21HJMPAGAINEXIT:MOVAH,4CHINT21HCODEENDSENDSTART;ASCII码在61H和7AH之间(小写字母)则转换为大写字母;ASCII码在41H和5AH之间(大写字母)则转换为小写字母;显示当前字符;循环;结束程序;指定START标号为程序入口地址2、把上述程序保存为ASM源文件,利用MASM根据对源文件进行汇编,产生.OBJ文件,若汇编时提示有错,编辑工具修改源程序后重新汇编,直至通过。3、用LINK将.OBJ文件连接成可执行的.EXE文件。4、在DOS状态下运行LINK产生的.EXE文件,按过键盘之后在屏幕上显示实验要求的字符,按ESC键可返回DOS。注:汇编过程中若出现错误,可参阅本章最后的实验附录。5.把上述程序改为简化段定义格式,再汇编,查看执行结果。
汇编语言程序设计实验指导147实验五分支结构程序设计实验目的1、掌握利用无条件转移指令JMP和有条件转移指令实现多分支程序的设计方法。2、掌握用DOS的中断调用,实现再程序执行过程中从键盘动态输入字符串的方法。3、掌握程序中标号的定义和使用。实验内容实现从键盘输入一个月份数值(1-12),根据输入的月份数值显示相应的月份英文单词缩写,如输入5则显示May。实验步骤1、编辑下列程序:.ndb'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'msg1db'Pleaseinputamonth(1-12):',13,10,'$'msg2db'',13,10,'$'bufferlabelbyte;定义输入月份的输入缓冲区maxlendb3;最多2个数字,包括一个回车actlendb?;保存实际输入的字符个数stringdb3dup(?);保存输入的月份数字内容(ASCII码).pshuru:;开始输入月份编号leadx,msg1movah,09hint21h;显示提示信息leadx,buffermovah,0ahint21h;输入月份数值cmpactlen,0;若没有输入月份则转出错处理jeshuruerr;以下判断输入月份是否合法leadi,stringcmpactlen,2jeda10;若输入的是2位数月份值则转到da10标号处执行moval,string;若只输入1位数字月份值,则读出该值andal,0fh;把ASCII码转换为对应数字
汇编语言程序设计148jmpjisuanda10:moval,stringandal,0fh;把月份数值十位的ASCII码转换为对应数字(如12月的1字)movbl,10mulblandstring[1],0fh;把月份数值个位的ASCII码转换为对应数字addal,string[1];十位加上个位(如12月)jisuan:;以下计算偏移地址cmpal,1;比1小是非法月份jbshuruerr;若月份值小于1则转出错处理cmpal,12jashuruerr;比12大也是非法月份subal,1;月份值减1shlal,1shlal,1;月份再乘4对应了MON字符串中从首地址开始的字符相对位置xorah,ah;1月份从0位置开始即JAN,...5月份从位置16开始即MAYleasi,mon;找到被显示月份字符的位置addsi,axmovcx,3output:movdl,[si];输出对应月份英文缩写movah,0shuruerr:leadx,msg2;输入出错时提示出错,并转到程序起始处重新执行movah,09hint21hjmpshuruend2、程序汇编通过后,运行程序察看输出结果。3、程序运行中不输入月份值(直接回车),或输入非法月份值,观察程序执行的情况。
汇编语言程序设计实验指导149实验六分支与循环混合结构程序设计实验目的1、掌握利用.IF语句实现分支程序的设计方法;2、掌握利用.REPEAT语句实现循环程序的设计方法;3、掌握DIV指令的使用特点;4、掌握地址表的定义和使用方法。实验内容实现成绩单的分等级统计功能,在数据段中有成绩单的定义,并包含有若干个分数,程序根据成绩单数据的个数循环分别统计个分数段成绩的个数,最后输出个等级段的分数个数。要求:成绩单数据少于100字节,输出的每个档次统计值按两位数显示。实验步骤1、编辑下列程序:.NDB42,62,68,70,79,82,85,90,95,99,66,88,78,90,98,200;成绩单countequ$-han;记录数据个数MEMDB6dup(0);分别用于存放各分数段成绩的个数scoreedb10,13,'Score"E"countis:$';定义各分数段的提示信息scoreddb10,13,'Score"D"countis:$'scorecdb10,13,'Score"C"countis:$'scorebdb10,13,'Score"B"countis:$'scoreadb10,13,'Score"A"countis:$'scoreodb10,13,'Score"Other"countis:$'tabledwscoreo,scoree,scored,scorec,scoreb,scorea;定义地址表.pMOVCX,countmovsi,0begin:;统计各个分数段的成绩个数.ifhan[si]<60addmem[1],1
汇编语言程序设计han[si]>=60addmem[2],han[si]>=70addmem[3],han[si]>=80addmem[4],han[si]>=90addmem[5],dmem[0],ncsiloopbeginmovcx,movsi,cxdecsiaddsi,simovdx,table[si]movah,9int21hxorah,ahmovsi,cxMOVal,mem[si-1]movbl,10divblmovmem[si-1],ahmovdl,ALadddl,30hMOVAH,2INT21HMOVAH,2movdl,mem[si-1]adddl,0END&&&&&&&&han[si]<=69han[si]<=79han[si]<=89han[si]<=99;开始循环;计算地址表中对应地址项与提示信息的对应关系;显示提示信息;读出统计好的一个数值(此处只能处理99以下的);ax/10;AH为余数是个位,暂时存放回该内存单元;al为商是十位;转换为ASCII码;以十进制形式显示十位;再显示个位;CX自动减1,减到0结束循环2、程序汇编通过后,运行程序察看输出结果。
汇编语言程序设计实验指导1513、修改成绩单的内容再重新汇编和运行程序,观察程序的结果变化情况。4、利用DEBUG工具的U命令反汇编可执行程序,观察.IF语句及.REPEAT语句所对应的汇编指令情况。5、利用MASM的命令行,汇编源文件并生成.LST列表文件,查看列表文件内容。注:实际上高级程序结构控制语句在汇编时,都转换成相应的比较指令和条件转移指令了。高级程序结构控制语句使得程序设计、理解都变得非常方便。实验七多重循环及过程的应用实验目的1、掌握多重循环程序和排序程序设计方法;2、掌握带符号数的比较及转移语句应用;3、伪指令EQU及操作符'$'的使用;4、掌握过程的定义和调用方法;5、掌握把内存数据(16位有符号2进制)按照10进制显示输出的方法。实验内容完成冒泡法排序程序,利用过程对排好序的数据按10进制显示输出实验步骤1、输入下列程序,汇编并连接通过。.raydw12,-66,108,9,5,-123,2000,-900;待排序数据countequ$-arraypushcountdb0;用于临时存放被显示数据的10进制总位数.pmovcx,countshrcx,1
汇编语言程序设计152deccxmovbl,-1again:;冒泡法排序外重循环movdx,cxandbl,bljeexitxorbl,blxorsi,siagain1:movax,array[si];内重循环.ifswordptrax>swordptrarray[si+2]xchgarray[si+2],axmovarray[si],axmovbl,-ncsiincsidecdxjnzagain1loopagainexit:movcx,countshrcx,1movsi,movax,array[si]callbintodecaddsi,dptrax<0negaxpushaxmovdl,'-'movah,ovbx,10loop1:cwddivbx;显示排好序的数据;过程定义;对于负数则取其相反数统一按正数处理;显示负号
汇编语言程序设计实验指导153pushdx;把每次除以10的余数压入堆栈,并记录数据位个数incpushcountcmpax,0jneloop1print:popdx;从堆栈弹出每位数据并显示adddx,30hmovah,2int21hdecpushcountjnzprintmovah,2;显示完一个数据的各个数位后再显示空格进行分隔movdl,''int21hpopdxpopbxretbintodecendpEND2、汇编并链接通过该程序,观察执行结果;3、试着把被排序的数据类型改为字节数据,程序该怎么修改?4、如果要把数据按16进制显示,该怎么修改程序?
汇编语言程序设计154实验八结构的应用及宏程序设计实验目的1、掌握结构的定义与使用方法;2、掌握宏定义及其调用和展开的具体过程;3、掌握宏的参数和局部标号的使用方法;4、掌握高级程序流程控制语句中判断是否相等的双等号应用;实验内容定义一个保存学生成绩单的结构,并且计算总分,最后按照总分的从高到低顺序显示成绩单,要求名次和成绩及总分都按照10进制显示输出。实验步骤1、输入下列程序,汇编并链接通过。.udentstructsnumberdw0siddb15dup('$')snamedb20dup('$')score1dw0score2dw0score3dw0ttscoredw0studentendsscoresheetstudentstudentstudentstudentstudent;结构定义;编号,代表名次;学号;最多20位,姓名;成绩1;成绩2;成绩3;总分<1,'computer01$','zhangsan$',90,70,60,><2,'computer02$','lisi$',100,0,100,><3,'computer03$','wanger$',95,66,88,><4,'computer04$','zhuwu$',120,90,99,><5,'computer05$','john$',90,80,95,>;成绩单长度可以任意,这里只列举5个纪录sheetlength=($-scoresheet)/(typescoresheet);成绩单长度,即纪录条数pushcountdb0;临时存放被显示数据的位数.code
汇编语言程序设计实验指导155nextlinemacro;显示换行的宏定义movah,2movdl,10int21hmovah,2movdl,13int21hendmdisponemacroone;显示一个字符的有参数宏定义movah,2movdl,oneint21hendmdispscoremacro;按照10进制显示内存单元数据的宏定义localloop1,print;局部标号定义pushbxpushdxmovbl,10loop1:divblmovdl,ahmovah,0pushdx;把每次除以10的余数压入堆栈,并记录数据位个数incpushcountcmpal,0jneloop1print:popdx;从堆栈弹出每位数据并显示adddl,30hdisponedldecpushcountjnzprintdispone20h;显示一个空格pleabx,scoresheetmovcx,movax,[bx].1;统计每条记录的总分
汇编语言程序设计156addax,[bx].2addax,[bx].3mov[bx].e,axmov[bx].r,0;名次初始化为0addbx,xzmovdx,0;DX控制总循环次数,初始值为0pushdxbegin:leabx,scoresheetmovcx,[bx].r==0;找到第一个未排名的纪录movax,[bx].e;总分记录在AX中.dbx,xzmovbx,offsetscoresheetmovcx,[bx].r==[bx].e>=ax;逐一比较找到一个未排序的且总分最高的纪录movax,[bx].e;AX保存最高的总分movdi,bx;有最高总分的记录地址保存在DI寄存器中.ddbx,xznextlinemovbx,dipopdxincdxpushdxmov[bx].r,dxmovax,dx;在新的一行显示每条记录信息;DX加1为当前名次;显示名次
汇编语言程序设计实验指导157dispscoreleadx,[bx].;显示学号movah,9int21hdispone20hleadx,[bx].;显示姓名movah,9int21hdispone20hmovax,[bx].1;显示成绩1dispscoremovax,[bx].2;显示成绩2dispscoremovax,[bx].3;显示成绩3dispscoremovax,[di].e;显示总分==ushdxjmpbeginend2、运行程序,可以看到显示结果如下:1computer04zhuwucomputer05john9080952653computer03wanger9566882494computer01zhangsan9070602205computer02lisi1000100200各记录是按照总分的降序显示的,其中第一列为名次,最后一列为总分。3、利用MASM工具汇编生成列表文件,并察看列表文件内容,注意其中的宏调用和展开过程,注意局部标号的重命名规律。4、修改结构的定义,在其中再增加两门成绩,并适当修改程序,重新观察运行结果。
汇编语言程序设计158实验九过程调用及模块化程序设计实验目的1、掌握过程定义、调用以及参数的传递方法。2、掌握利用全局变量和堆栈传递参数的区别。3、掌握过程定义伪指令:PROC、ENDP、NEAR和FAR。4、掌握指令:CALL、RET、RETn。5、掌握386指令集的定义方法。6、掌握模块间的远调用和近调用的区别与实现。7、掌握模块间变量访问的方法。实验内容及步骤一、利用堆栈传递参数的子程序调用1、输入以下程序.PMOVPUSHLEAPUSHCALLMOVAX,COUNT1AXAX,ARRAY1AXFARPTRSUMSAX,COUNT2;第一个数组首地址入栈;调用求和过程;第一个数组元素数入栈DWDDDWDD100,200,30,40,50,60,70,80,9,10?10,110,120,103,14,150?EQU($-ARRAY1)/2;指定指令集,可以使用32位寄存器EQU($-ARRAY2)/2
汇编语言程序设计实验指导0SUMSPROCMOVMOVMOVXORAGAIN:ADDADCINCINCLOOPMOVRETSUMSENDPENDAXAX,ARRAY2AXFARPTRSUMSFARBP,SPCX,[BP+6]BX,[BP+4]EAX,EAXAX,[BX]EAX,0BXBXAGAIN[BX],EAX4;保存数组元素的和;返回主程序并堆栈平衡;循环求数组元素的和;处理进位;从堆栈中获得数组元素个数;从堆栈中获得数组首地址2、汇编和链接程序,生成可执行程序。3、用DEBUG调试工具的T命令运行此程序,观察每次过程调用及进出栈指令前后的SP和堆栈内容的变化情况。3、记录最后结果:SUM1,SUM2的段及偏移地址和它们的内容。二、模块间的调用和转移1、分别输入以下三个程序,保存文件名分别为、和。为程序主模块,内容如下:EXTRNSUB1:FAR;声明SUB1是外部模块定义的过程,调用方法;是一个远过程调用CSEGSEGMENTPARAPUBLIC'CODE'ASSUMECS:CSEGSTART:CALLFARPTRSUB1;主程序只调用了SUB1过程MOVAH,4CHINT21HCSEGENDS
汇编语言程序设计为子程序从模块,内容如下:PUBLICSUB1;声明SUB1是为外部程序调用的EXTRNSUB2:NEAR;声明SUB2是外部模块定义的过程,调用方法;是一个近距离过程调用TEXTSEGMENTPARAPUBLIC'CODE'ASSUMECS:TEXTSUB1PROCFARMOVDL,'A';SUB1过程的功能是显示一个‘A’MOVAH,2INT21HCALLSUB2;调用SUB2过程为另一个子程序从模块,内容如下:PUBLICSUB2;声明SUB2是为外部程序调用的TEXTSEGMENTPARAPUBLIC'CODE';此代码段与程序的代码段同名,;链接时可以与P2程序的代码段连成一个段ASSUMECS:TEXTSUB2PROCNEARMOVDL,'B';SUB1过程的功能是显示一个‘B’MOVAH,2INT21HRETSUB2ENDPTEXTENDSEND2、在命令提示符窗口下分别执行以下命令,把三个源文件汇编成目标文件:ml///其中的/c选项是只汇编成OBJ文件,而不链接成EXE文件。3、在命令提示符窗口下执行++命令,把三个目标文件链接成可执行的EXE文件,即。4、执行文件会显示字母A和B。5、在DEBUG环境中,用U命令观看并记录远调用和近调用中的代码。
汇编语言程序设计实验指导161三、模块间的变量传递1、分别输入以下两个程序,保存文件名分别为和。程序是主模块,内容如下:STACKSTACKEXTRNDATASEGMENTSTACKDW10DUP(?)ENDSADDSUB:FARSEGMENTOPRN1OPRN2OPRN3DATACODEDWDWDW1234H4321H?,?;声明外部模块定义的过程PUBLICOPRN1,OPRN2,OPRN3;声明三个公共变量可以被外部模块使用ENDSSEGMENTASSUMECS:CODE,DS:DATA,SS:STACKAX,DATADS,AXADDSUBAH,4CH21HSTART;调用外部过程START:是子模块,内容如下:OPRN1:WORD,OPRN2:WORD,OPRN3:WORD;声明本模块中可以引用的公共变量及调用类型PUBLICADDSUBCODEADDSUBSEGMENTASSUMEPROCPUSHPUSHCS:CODEFARBXAX;声明可以被外部模块调用的过程MOVAX,OPRN1MOVBX,OPRN2ADDAX,BXMOVOPRN3,AX;存放两个参数的和
汇编语言程序设计162MOVAX,OPRN1SUBAX,BXMOVOPRN3[2],AXPOPPOPRETADDSUBENDPCODEENDSEND2、分别汇编以上两个源文件,生成对应的OBJ文件,再链接这两个目标文件得到EXE可执行程序。3、用DEBUG工具调试此可执行程序,察看文件链接后代码段的内容构成,用T命令单步执行程序,并注意观察运算结果。AXBX;存放两个参数的差
汇编语言程序设计实验指导163*实验十汇编语言综合实验实验目的1、掌握C语言和汇编语言的混合编程方法;2、了解了解磁盘文件的读写方法;实验内容及步骤一、汇编语言和C语言混合编程1、输入以下C语言程序,其功能为演示在中模式下TC程序调用汇编语言子函数的过程,保存的文件名为MAIN.C#include"stdio.h"externintsubs(int,int);/*声明subs为外部函数*/main(){intx=0;inty=0;scanf("%d%d",&x,&y);printf("nCallsubs(%d,%d),theresultis:%d",x,y,subs(x,y));}2、输入以下汇编语言子程序,其功能为实现两个整数相减,保存程序文件名为BLIC_SUBS_SUBSPROCFARPUSHBPMOVBP,SPMOVAX,[BP+6];AX是被减数SUBAX,[BP+8];相减POPBP;恢复BP寄存器的内容RET_SUBSENDPEND3、在DOS提示符下输入如下两条命令:ml/;把汇编成文件,但不链接(注意大小写)。tcc–mm–Iinclude–
汇编语言程序设计164;该命令按照中型模式链接程序,直接把MAIN.C编译成目标文件,并和链接生成程序。4、运行MAIN.C程序,输入两个整数,观察输出结果。5、分析在SUB子程序中取得参数为什么用BP+6和BP+8地址获得?二、磁盘文件读写实验1、在D:建立一个文本文件,并在文件中输入内容“南京航空航天大学信息科学与技术学院欢迎您!”,也可以输入其它信息。2、输入以下汇编语言文件,并汇编、链接通过。.NDLEDW?filename1db'd:',0filename2db'd:',0tempdb1000dup(?).pleadx,filename1moval,0movah,3dhint21h;打开文件jcerrormovhandle,ax;文件代号存入HANDLEmovah,3fhmovbx,handlemovcx,34leadx,temp;读取打开的文件,读字节数在CX中int21h;读取的内容存放在TEMP中jcerrormovbx,handlemovah,3eh;关闭该文件int21hmovah,3chmovcx,0leadx,filename2int21hjcerrormovhandle,ax;建立文件
汇编语言程序设计实验指导165movah,40hmovbx,handlemovcx,34;把TEMP中的内容写入到当前文件中leadx,tempint21hmovbx,handle;关闭该文件movah,3ehint21herror:.exit0end3、执行该程序,察看d:文件的内容4、请修改程序,使得在运行时输入具体内容,并把输入的内容存入文件中。三、打印ASCII码表实验1、输入以下程序,并汇编、链接通过。.pmovbl,0hmovbh,0houter1:addbl,bh;打印特殊字符(控制字符)cmpbl,0ahjecout_breakcmpbl,0dhjecout_breakcmpbl,07hjecout_breakcmpbl,08hjecout_breakcmpbl,09hjneouter2cout_break:movdl,20h;显示空格movah,2int21hjmpouter3outer2:movdl,bl;打印可见字符movah,2int21h
汇编语言程序设计166outer3:movdl,20h;输出空格movah,2int21haddbl,10h;改变列循环变量subbl,bhcmpbl,0f0h;比较列循环变量与转移条件的值jneouter1movbl,0f0h;输出每一行的最后一个字符addbl,bhmovdl,blmovah,2int21houter4:movdl,0ah;输出回车换行movah,2int21hmovdl,0dhmovah,2int21hincbh;改变行循环变量movbl,0h;列循环变量置零cmpbh,0fh;比较行循环变量与转移条件的值0end2、运行程序,观察显示结果,将看到ASCII码表,请与实验三的附录作比较,看有什么不同?3、请仔细分析程序内容,读懂每行语句的功能
汇编语言程序设计实验指导167实验附录汇编语言常用出错信息汇编程序在对源程序的汇编过程中,若检查出某语句有语法错误,随时在屏幕上给出出错信息,以便操作人员即时查找错误,给予更正。MASM出错信息格式如下:错误编号0错误描述Blocknestingerror嵌套出错。嵌套的过程、段、结构、宏指令或重复块等非正常结束。例如在嵌套语句中有外层的结束语句,而无内层的结束语局Extracharactersonline一语句行有多余字符,可能是语句中给出的参数太多Internalerror-Registeralreadydefined这是一个内部错误。如出现该错误,请记下发生错误的条件,并使用ProductAssistanceRequest表与Microsoft公司联系Unkowntypespecifer未知的类型说明符。例如类型字符拼错,把BYTE写成BIT,NEAR写成NAER等Redefinitionofsymbol符号重定义。同一标识符在两个位置上定义。在汇编第一遍扫描时,在这个标识符的第二个定义位置上给出这个错误Symbolismultidefined符号多重定义。同一标识符在两个位置上定义。在汇编第二遍扫描时,每当遇到这个标识符都给出这个错误Phaseerrorbetweenpasses两次扫描间的遍错。一个标号在二次扫描时得到不同的地址值,就会给出这种错误。若在启动MASM时使用/D任选项,产生第一遍扫描的列表文件,它可帮助你查找这种错误AlreadyhadELSEclause已有ELSE语句。在一个条件块里使用多于一个的ELSE语句Mustbeinconditionalblock没有在条件块里。通常是有ENDIF或ELSE语句,而无IF语句Symbolnotdefined符号未定义,在程序中引用了未定义的标识符Syntaxerror语法错误。不是汇编程序所能识别的一个语句Typeillegalincontext指定非法类型。例如对一个过程指定BYTE类型,而不是NEAR或FARGroupnamemustbeunique组名应是唯一的。作为组名的符号作为其他符号使用Mustbedeclaredduringpass1必须在第一遍扫描期间定义。在第一遍扫描期间,如一个符号在未定义前就引用,就会出现这种错误。Illegalpublicdeclaration一个标识符被非法的指定为PUBLIC类型Symbolalreadydefferentkind重新定义一个符号为不同种类符号。例如一个段名重新被当作变量名定义使用Reservedwordusedassymbol
汇编语言程序设计27282936373839把汇编语言规定的保留字作标识符使用Forwardreferenceillegal非法的向前引用。在第一遍扫描期间,引用一个未定义符号。Operandmustberegister操作数位置上应是寄存器,但出现了标识符Wrongtypeofregister使用寄存器出错Operandmustbesegmentorgroup应该给出一个段名或组名。例如ASSUME语句中应为某段寄存器和指定一个段名或组名,而不应是别的标号或变量名等Symbolhasnosegment不知道标识符的段属性Operandmustbetypespecifier操作数应给出类型说明,如NEAR、FAR、BYTE等Symbolalreaddefinedlocally以被指定为内部的标识符,企图在EXTRN语句中又定义外部标识Segmentparanetersarechanged段参数被改变。如同一标识符定义在不同段内Improperalign/combintype段定义时的定位类型/组合类型使用出错Referencetomultidefinedsymbol指令引用了多重定义的标识符Operandexpected需要一个操作数,只有操作符Operatorexpected需要一个操作符,但只有操作数Divdsionby0oroverflow除以0或溢出Negativeshiftcount运算符SHL或SHR的移位表达式值为负数Operandtypemustmatch操作数类型不匹配。双操作数指令的两个操作数长度不一致,一个是字节,一个是字Illegaluseofexternal外部符号使用出错Mustberecordfieldname应为记录字段名。在记录字段名位置上出现另外的符号Mustberecordnameorfieldname应为记录名或记录字段名。在记录名或记录字段名位置上出现另外的符号Operandmustbesize应指明操作数的长度(如BYTE、WORD等)。通常使用PTR运算即可改正Mustbevariable,label,orconstant应该是变量名、标号、或常数的位置上出现了其他信息Mustbestucturefieldname应该为结构字段名。在结构字段名位置上出现了另外的符号Lefeoperandmustsegment操作数的左边应该是段的信息。如设DA1、DA2均是变量名,下列语句就是错误的:“MOVAX,DA1:DA2”。DA1位置上应使用某段寄存器名Oneoperandmustconstant操作数必须是常数。
汇编语言程序设计实验指导4454647484956575859606162Operandmustbeinsamesegmentoroneconstant“—”运算符用错。例如“MOVAL,—VAR”,其中VAR是变量名,应有一常数参加运算。又如两个不同段的变量名相减出错Normaltypeoperandexpected要求给出一个正常的操作数。Constantexpected要求给出一个常数。Operandmusthavesegment运算符SEG用错。Mustbeassociatedwithdata在必须与数据段有关的位置上出现了代码段有关的项Mustbeassociatedwithcode在必须与代码段有关的位置上出现了数据段有关的项Multiplebaseregisters同时使用了多个基址寄存器。如“MOVAX,[SI][BP]”Multipleindexregisters同时使用了多个变址寄存器。如“MOVAX,[SI][DI]”Mustbeindexorbaseregister指令仅要求使用基址寄存器或变址寄存器,而不能使用其他寄存器。Illegaluseofregister非法使用寄存器出错Valueisoutofrange数值太大,超过允许值。例如:“MOVAL,100H”OperandnotincurrentCSASSUMEsegment操作数不在当前代码段内。通常指转移指令的目标地址不在当前CS段内Improperoperandtype操作数类型使用不当。例如:“MOVVAR1,VAR2”。两个操作数均为存储器操作数,不能汇编出目标代码Jumpoutofrangeby%ldbyte条件转移指令跳转范围超过-128~+127个字节。出错厂、信息同时给出超过的字节数Indexdisplacementmustbeconstant变址寻址的位移量必须是常数Illegalregistervalue非法的寄存器值。目标代码中表达寄存器的值超过7Immediatemodeillegal不允许使用立即数寻址。例如“MOVDS,CODE”其中CODE是段名,不能把段名作为立即数传送给段寄存器DSIllegalsizeforoperand使用操作数大小(字节数)出错。例如:使用双字的存储器操作数Byteregisterillegal要求用字寄存器的指令使用了字节寄存器。如PUSH,POP指令的操作数寄存器必须是字寄存器IllegaluerofCSregister指令中错误使用了段寄存器CS。如:“MOVCS,AX”CS不能做目的操作数Mustbeaccumulatorregister要求用AX或AL的位置上使用可其他寄存器。如IN,OUT指令必须使用累加器AX或ALImproperuerofsegmentregister不允许使用段寄存器的位置上使用了段寄存器。如“SHLDS,1”MissingorunreachableCS
汇编语言程序设计6364656667686976777817485试图跳转去执行一个CS达不到的标号。通常是指缺少ASSUME语句中CS与代码段相关联Operandcombinationillegal双操作数指令中两个操作数组合出错NearJMP/CALLtodifferentCS试图用NEAR属性的转移指令跳转到不在当前段的一个地址Labelcannothavesegmentoverride段前缀使用出错Musthaveinstuctionagterprefix在重复前缀REP,REPE,REPNE后面必须有指令CannotoverrideESfordestination串操作指令中目的操作数不能用其他段寄存器替代ESCannotaddresswithsrgmentregister指令中寻找一个操作数,但ASSUME语句中未指明哪个段寄存器与该操作数所在段有关联Mustbeinsegmentblock指令语句没有在段内CannotuseEVENorALIGNwithbytealignment在段定义伪指令的定位类型中选用BYTE,这时不能使用EVEN或ALIGN伪指令ForwardneedsoverrideorFAR转移指令的目标没有在源程序中说明为FAR属性,可用PTR指定IllegalvalueforDUPcount操作符DUP前的重复次数是非法的或未定义Symbolidalreadyexternal在模块内试图定义的符号,它已在外部符号伪指令中说明DUPnestingtoodeep操作数DUP的嵌套太深Illegakuseofundefindeoperand(?)不定操作符“?”使用不当。例如“DB10HDUP(?+2)”Toomanyvalerforstrucorrecordinitialization在定义结构变量或记录变量时,初始值太多Anglebracketsrequoredaroundinitializedlist定义结构体变量时,初始值未用尖括号(<>)括起来Directiveillegalstructure在结构体定义中的伪指令使用不当。结构定义中的伪指令语句仅二种:分号(;)开始的注释语句和用DB、DW等数据定义伪指令语句OverridewithDUPillegal在结构变量初始值表中使用DUP操作符出错Fieldcannotbeoverridden在定义结构变量语句中试图对一个不允许修改的字段设置初值Overrideidofwrongtype在定义结构变量语句中设置初值时类型出错CircularchainofEQUaliases用等值语句定义的符号名,最后又返回指向它自己。如:AEQUBBEQUACannotemulatecooprocessoropcode仿真器不能支持的8087协处理器操作码Endoffile,notENDdirective源程序文件无END结束命令Dataemittedwithnosegment语句数据没有在段内
版权声明:本文标题:汇编语言程序设计实验指导 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1704989932a468794.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论