汇编语言常见问题实验报告(带正确源代码).docx

上传人:wux****ua 文档编号:8850149 上传时间:2020-04-01 格式:DOCX 页数:34 大小:65.88KB
返回 下载 相关 举报
汇编语言常见问题实验报告(带正确源代码).docx_第1页
第1页 / 共34页
汇编语言常见问题实验报告(带正确源代码).docx_第2页
第2页 / 共34页
汇编语言常见问题实验报告(带正确源代码).docx_第3页
第3页 / 共34页
点击查看更多>>
资源描述
汇编语言程序设计实验报告计科0803余廷钊2008420692010 7-7实验一:字符回显实验目的:掌握DOS 1号功能的调用。实验原理:ah里面放功能号。用int21调用。开始实验内容:code segmentah=1 assume cs:codestart: mov ah,1;功能号放入ahint 21h int 21h;调用DOS功能 mov ah,4ch;返回DOS结束 int 21h code ends end start结果分析:DOS 1号功能可以把键盘的输入回显到屏幕上。技术支持:Michael实验二:显示字符T实验目的:掌握DOS 2号功能的调用。实验原理:ah里面放功能号。DL里面放要显示的字符,用int21调用。开始实验内容:code segment assume cs:codeah=2start: mov dl,TDL=T mov ah,2;功能号存入 int 21h;调用int 21h mov ah,4ch int 21h code ends结束 end start技术支持:Michael结果分析:DOS 2 号功能可以吧 DL中的数据按照它对应的ASK码字符输出。实验三:显示how are you实验目的:掌握利用DOS功能显示字符串。实验原理:DOS 9 号功能可以把DS:DX中的字符串显示出来,一$为结束识别。实验内容:开始data segment message db How are you?,13,10,$data ends数据段首地址送到DScode segment assume cs:code,ds:datastart:功能号送到AH mov ax,data mov ds,ax ;数据段地址给ds mov ah,9调用DOS功能显示字符串 mov dx,offset message;送入偏移地址int 21h ;功能调用 mov ah,4ch int 21h结束code endsend start结果分析:DOS 9 号功能可以把以DS:DX为首地址,以$为结束的字符串输出。实验四:小写转大写实验目的:掌握一些基本的程序分支编写方法。实验原理:利用CMP比较来判断是否为小写字母,在利用SUB将小写字母的ASC码转换为大写的ASC码。实验内容:输入一个小写字母,输出它所对应的大写字母。data segmenterrorword db error,13,10,$;错误提示信息data endsCODES SEGMENT ASSUME CS:CODESSTART: mov ax,data mov ds,ax;数据段地址放入ds开始 mov ah,07h int 21h;输入一个小心字母输入字符 cmp al,a jl error;输入不合法 cmp al,z是否小于a jg error;输入不合法,直接输出出错信息 sub al,20h;小写变大写 mov dl,al mov ah,02h否 int 21h jmp over是是否大于z error: lea dx,errorword否 mov ah,09h int 21h;输出出错信息输出出错信息转为大写 over: MOV AH,4CH INT 21HCODES ENDS END START结束结果分析:CMP对两个数比较过后标记会发生改变,可以根据标记寄存器的情况来判断两个数的大小情况,再利用jmp等语句可以实现类似于C语言中if的功能。问题讨论:用CMP对两个数进行比较之后,标志寄存器里面哪些标记位发生了变化?有哪些跳转语句可以对这些标志位进行判断?CMP AL,BL ALBL CF=0 ALBL CF=1AL=BL ZF=1 AL=BL ZF=0JL 是当 CF=1是跳转 JG相反, JZ/JE是ZF=1时跳转 JNZ/JNE相反JB与JA等于 JL和JG实验心得:有效的利用CMP和JZ等跳转语句的结合可以编写含有分支的程序,在程序中融入了判断。技术支持:Michael参考文献:IBM-PC汇编语言程序设计(第二版)实验五:输出10个F实验目的:在程序中编写循环语句。实验原理:LOOP语句可以达到循环。实验内容:开始输出10个F到显示器上。code segment assume cs:code对功能调用初始化start: mov dl,F mov cx,10;置循环次数设置循环次数 mov ah,2 again:功能调用 int 21h;显示 loop again否CX减1(自动) mov ah,4ch ;返回DOS int 21h判断循环标志CX是否为0为0code endsend start是结束结构分析:LOOP AGAIN语句可以使AGAIN与LOOP直接的语句执行CX中对应数据的次数。问题讨论:不用LOOP可以做出循环吗?可以利用CMP和JZ等语句实现。实验拓展:如果要输出10行10列的F,怎么嵌套循环。可以用一下语句实现:mov bl,10repeat:mov cx,10 again: int 21h loop again(输出回车的语句) dec blcmp bl,0jnz repeat实验心得:利用LOOP做循环语句很方便,可是也会出现一些问题,所以可以结合条件循环让程序的编写更方便。技术支持:Michael实验六:命令识别实验目的:熟悉判断与循环的结合使用。实验原理:CMP可以用来判断,LOOP可以用来做循环。实验内容:从键盘输入一个字符,如果是a则显示10个*,如果是b则显示10个$。code segment开始 assume cs:codestart: mov ah,1DL置* int 21h;输入字符 mov dl,* cmp al,a ;是a 保留 *输入命令字 je next mov dl,$ ;不是a 改为$cmp al,b ;不合法直接结束输入是否ajne over是next : 否mov cx,10 ;置输出的个数 mov ah,2输入是否b again: int 21h否是 loop again ;循环输出字符 mov ah,4chDL置$ int 21hover:code ends显示DL中的字符10个结束end start技术支持:Michael实验心得:编写程序的过程中应该尽量减少相同功能代码的重复编写,例如本题关于显示10个*或10个$可以只是更改DL中的内容,其他部分相同代码可以只书写一次。实验七:字符串大小写转换实验目的:掌握字符串的一些基本操作技巧。实验原理:数据段中的字符在内存中是按照顺序存储的方式的。实验内容:开始输入一个字符串,把所以字符按大写形式显示出来。data segmentmy_input db 20,?, 20 dup($)data ends输入字符串code segmentassume cs:code,ds:data字符串长度赋到CXSI初始为1start:lea dx,my_inputmov ax,datamov ds,ax ;数据段地址给dsmov ah,0ahSI加一int 21hmov ch,0mov cl,my_input+1判断my_input:si是否小写mov si,1 ;si为当前比较的偏移位置again:inc si;si加一比较下一个mov al,my_input+si是cmp al,a小写变大写jb next ;不是小写字母cmp al,zja next否sub al,20h;小心转大写CX减1mov my_input+si,alnext:loop again否mov ax,dataCX是否为0mov ds,axlea dx,my_input+2是mov ah,09hint 21h;将处理过的字符显示输出调整过的字符mov ah,4chint 21h结束code endsend start结果分析:利用DOS 10号功能输入的字符串,其第一个存储单元内是最大数据数,第二个存储单元内是实际字符数。利用10号功能输入数据段的字符串如果要利用9号功能显示出来,必须注意要跳过前面两个单元,并且还要在最后一位那里加$。实验心得:对字符串的处理往往利用了字符串的顺序存储性质,借以SI辅组可以利用循环对所以元素操作。技术支持:Michael实验八:显示前导与后续实验目的:熟悉应用程序编写中经常用到的用户提示表示方法,学会利用ASK码解决问题。实验原理:小写字母的ASK码是按照a-z顺序排列的。实验内容:编写程序从键盘输入一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。编程要求:程序执行后,给出下列提示操作:Please input the character:程序要有保护措施,对于非法输入不受理,不回显,但是显示错误信息。代码:data segment message db =error=,10,$ start_m db please input one character:,10,$data ends开始code segment assume cs:code,ds:datastart:显示输入提示信息 mov ah,9 mov dx,seg start_m mov ds,dx mov dx,offset start_mint 21h输入字符 mov ah,7 int 21hcmp al,a;输入不合法 小于ajs next字符小于a是否字符大于zcmp al,z;大于z不合法jns next是mov ah,2否mov dl,alsub dl,1 ;减为前导字符 int 21h输出前导字符显示出错信息add dl,1 ;再加一还原为输入int 21hadd dl,1 ;减一转为后续字符int 21h输出输入的字符jmp overnext: mov ah,9 mov dx,seg message输出后续字符 mov ds,dx mov dx,offset message int 21h ;输出出错信息over: mov ah,4ch结束 int 21h ;返回DOS code ends end start结果分析:小写字母a-z的ASC码是按照由a到z顺序增加的。问题讨论:a 的前导字符和z的后续字符已经不再是小写字母,是否该归为错误的输入?虽然它们不在是小写字母,但是该ASC码依然对应有效的字符,可以算做是正确的输入,照常进行处理。技术支持:Michael参考文献:IBM-PC汇编语言程序设计(第二版)实验九:删除数字实验目的:掌握数据的提取,熟悉数据段中数据的转移与复制。实验原理:数据在数据段中是以ASC码的形式顺序存放的。实验内容:题目:编写程序,将数据段string中的所有数组字符删除掉。代码:data segment开始string db fh84392hkHHo382,13,10,$ans db 20 dup($)data endsSI和DI置0code segmentassume cs:code,ds:datastring+si是否为数字start:否是mov ax,data把String+si放到 ans+di中mov ds,axlea dx,stringmov ah,09hDI加1int 21hmov si,0mov cl,15SI加1mov di,0again:CX减1mov al,string+si否cmp al,0 ;小于0 不是数字判断CX是否为0jb movecmp al,9 ;大于9 也不是数字ja move是jmp next ;是数字 直接跳过把ans中的内容移动到string中move:mov ans+di,al;不是数字 存入inc dinext:结束inc siloop againmov cx,diinc cxmov si,0moveback: ;将加工过后的字符串送回mov bl,ans+simov string+si,blinc siloop movebacklea dx,stringmov ah,09hint 21hmov ah,4chint 21hcode endsend start实验心得:如果要在原串中直接进行操作,那么在数据的移动上面会非常麻烦也非常耗时,如果利用一段辅组的空间来辅助转移将会减少很多工作量。但是这也在一定程度上浪费了一部分的存储空间。技术支持:Michael实验十:口令校对实验目的:熟练掌握汇编的字符串的操作,对分支程序的把握加深。实验原理:字符串在数据段中是顺序存储的,可以利用DOS的功能操作数据段中的内容。实验内容:编程要求:程序执行后,给出操作提示,例如:“please input the password:”等待用户输入密码与内定的字符串进行比较。放输入的字符串与程序内定的字符串不相同时,显示“password error!”信息,允许重新输入,当三次输入的都不正确时,结束运行返回DOS。内容:data segmentcode_input db 7,?,6 dup(?)pass_code db 7,6,123456error_message db error code,13,10,$start_message db please input the password:,13,10,$right_message db correct code,13,10,$times db 3data endscode segmentassume cs:code,ds:data开始start:again_input:显示开始提示信息mov al,timessub al,1SI置0,CX置6,标记置0cmp al,0 ;判断是否已经三次错误je errormov times,al输入密码mov ax,datamov ds,axlea dx,start_message比较第SI位是否匹配mov ah,09hint 21h;输出开始提示否是lea dx,code_inputCX减1,SI加1mov ax,datamov ds,axmov ah,0ah否int 21h ;输入密码CX是否为0mov cl,6mov si,2again:是mov al,code_input+simov bl,pass_code+si输出出错信息输出成功信息cmp al,bl ;是否匹配?jne again_input;不匹配再输inc si;匹配下一个字符loop again是标记是否到3mov ax,datamov ds,axlea dx,right_message 否mov ah,09hint 21h;输出成功信息标记加1mov ah,4chint 21hjmp over ;跳过错误提示的输入error:结束mov ax,datamov ds,axlea dx,error_messagemov ah,09hint 21h ;输出出错信息mov ah,4chint 21h;返回DOSover:code endsend start结果分析:如果某数据段的长度为l 则利用DOS 10号功能输入字符的时候不能输入超过l的长度的字符,系统会自动调整,把多余的部分去掉。实验心得:对于分支复杂的程序,要熟练掌握跳转语句的运用。如果某部分出现漏洞,极有可能陷入死循环等状况。技术支持:Michael实验十一:显示输入的字符串实验目的:掌握DOS 9号和10号功能的运用与联系。实验原理:DOS9好功能可以显示数据段中的一段字符串,DOS 10号功能可以把一段字符串输入到数据段缓冲区中。实验内容:data segmentcode_input db 20 dup($)开始data endscode segment10号功能输入字符串assume cs:code,ds:datastart:mov ax,data添加回车与换行mov ds,axlea dx,code_inputmov ah,0ah9号功能显示字符串int 21h ;输入字符串mov code_input,13mov code_input+1,10lea dx,code_input结束mov ah,09hint 21h ;输出字符串mov ah,4chint 21hcode endsend start结果分析:10号功能输入的字符串,实际上第一个单元存放的是最大大小,第二个单元存放的是实际的字符长度。9号功能输出的停止标准是$。技术支持:Michael参考文献:IBM-PC汇编语言程序设计(第二版)实验十二:编写程序显示蓝屏实验目的:初步掌握BIOS的功能调用方法,并运用其显示蓝屏。实验原理:BIOS 6号功能可以以不同的属性初始化或上卷屏幕。实验内容:开始code segmentassume cs:code功能号6放入ahstart: mov ah,6设置寄存器中的各参数 mov al,0 mov bh,10h;蓝色设定 mov ch,0 mov cl,0用int 10h调用BIOS功能 mov dh,24 ;范围设定 mov dl,79 int 10h ;上卷 mov ah,4ch结束 int 21hcode ends end start结果分析:BIOS 6号调用可以用于屏幕的初始化。参考文献:IBM-PC汇编语言程序设计(第二版)技术支持:Michael实验十三:闪烁的I LOVE YOU实验目的:学会利用BIOS的13h号功能显示特定格式的字符。实验原理:BIOS的13h号功能可以通过调整参数,一特定的格式输出以ES:BP为首地址,长度为(CX)的字符串。实验内容:题目:程序运行后屏幕清为黑色,按任一键之后显示5个“I LOVE YOU”并闪烁,按ESC键退出程序。代码:开始data segmentIloveYou db I Love You!,13,$data ends清为黑屏code segmentassume cs:code接收一个字符start: mov ah,6 ;6号功能号放入,清屏是否为设定的字符 mov al,0 mov bh,07h mov ch,0是否 mov cl,0 mov dh,24显示五个I LOVE YOU mov dl,79 int 10h ;清屏 mov ah,7 input: int 21h cmp al,i输入退出命令 jnz inputmov dh,0hmov ax,datamov es,axlea bp,IloveYou ;首地址放入bp否是否为ESCmov bh,0mov bl,87hagain:mov al,1mov dl,15是mov ah,13h ;13号功能 显示mov cx,10 ;设定字符串长度结束add dh,1int 10h ;功能调用显示I LOVE YOUcmp dh,5 ;判断是否已经5次jb again ;循环五次over:mov ah,7int 21hcmp al,1bhjnz over mov ah,4ch int 21hcode ends end start结果分析:利用BIOS 13h号功能输出字符可以达到DOS 的9号功能所达不到的效果,可以通过各项参数的调整来改变输出字符的格式,当然这样比较麻烦,所以当对格式没有什么要求的时候还是用DOS的调用比较好。技术支持:Michael实验十四:YANG实验目的:熟悉BIOS的9号功能的运用,对文本的设置方式熟练掌握。实验原理:BIOS 9号功能可以根据BL里面设置的属性在(BH)页显示(CX)个AL里面的字符。实验内容:应用文本方式图形处理,在屏幕上显示4行,每行10个相同字符,这四个字符依次是,Y,A,N,G,各行颜色不同。代码:开始stack segment dw 20 dup(?)stack ends设置第1行的属性code segment assume cs:code,ss:stackmain proc far调用BIOS功能mov al,Y ;参数设定mov bx,0dbhcall show ;调用子函数设置第2行的属性mov al,Amov bx,0cbhcall show调用BIOS功能mov al,Nmov bx,0dah设置第3行的属性call show调用BIOS功能mov al,Gmov bx,0d3hcall showmov ah,4ch设置第4行的属性int 21hmain endp调用BIOS功能show proc near ;显示10个相同字符的子函数 mov ah,09hmov cx,10结束int 10hmov ah,02mov dl,13int 21hmov dl,10int 21hretshow endp code endsend main实验心得:一些基本类似的程序段,可以提取为子函数,这样可以大大的减少工作量,对于参数少的子函数,可以直接用寄存器传递参数,方便快捷。技术支持:Michael 参考文献:IBM-PC汇编语言程序设计(第二版)实验十五:数字转为ASC码实验目的:加深对ASK码的了解,熟悉对数据段内数据的操作。实验原理:数字对应的ASK码正好是该数字加上30H。实验内容:题目:编写程序,实现将数据段BUFF开始字节单元中的10个数字0,1,2,3,4,5,6,7,8,9转换为相应的ASC码送入以ASC开始的内存单元。代码:DATAS SEGMENT buff db 0,1,2,3,4,5,6,7,8,9,$开始asc db 11 dup(?) DATAS ENDSSI赋为0,CX为10CODES SEGMENT ASSUME CS:CODES,DS:DATASSTART:将BUFF+SI中的数加上30h MOV AX,DATAS MOV DS,AX mov si,0mov cl,10;循环10次将处理过后的数据放到ASC+SI中again:mov al,buff+siadd al,48 ;加上30h转为对应ASC码SI加1,CX减1mov asc+si,alinc siloop againmov asc+si,$CX是否为0lea dx,ascmov ah,09hint 21h ;显示转换后的内容 MOV AH,4CH INT 21H结束CODES ENDS END START结果分析:由ASC的输出可知数字的ASC码正好是对应的数字加一,是按照数字大小递增的。实验十六:数据传送实验目的:熟悉对数据段内数据的操作。实验原理:数据在数据段中是顺序存储的。实验内容:开始data segmentbuff db abcdefghijklm,$asc db 15 dup(?)code segment assume cs:code,ds:dataCX置字符个数Si置0start:mov ax,datamov ds,axmov si,0mov cx,14 ;一共14个字符将buff+si的内容转移到ASC+si里面again:mov al,buff+simov asc+si,alinc si ;传送下一个loop againlea dx,ascmov ah,09hCX减一SI加一int 21h ;显示asc里面的内容mov ah,4chint 21h code ends end start否判断CX是否为0结果分析:无。是技术支持:Michael结束参考文献:IBM-PC汇编语言程序设计(第二版)实验十七:显示五行HELLO实验目的:熟悉利用DOS调用显示字符串。实验原理:DOS 9号功能调用可以显示以DS:DX为首地址的字符串,以$为结束标志。实验内容:代码:DATAS SEGMENT开始 hello db HELLO,13,10,$DATAS ENDS功能号放入AHCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART:mov cx,5 ;置循环次数为5mov ax,datas地址放入DS:DXmov ds,axlea dx,hellomov ah,09hagain:CX置5int 21h ;输出一行HELLOloop again MOV AH,4CH功能调用,显示字符串,换行 INT 21HCODES ENDS END STARTCX减1结束CX是否为0实验心得:可以利用循环语句减少代码量。技术支持:Michael参考文献:IBM-PC汇编语言程序设计(第二版)实验十八:四个矩形块实验目的:掌握BIOS 6号功能调用。实验原理:BOIS 6号功能可以以指定的行属性卷起制定矩形区域内的所以行。实验内容:题目要求:应用图形方式图形处理,将显示器置于,中分辨率图形方式。然后用四种颜色各显示一个矩形块。code segmentassume cs:codestart:开始 mov ah,6 mov al,0 mov bh,10h左上块卷屏 mov ch,0 mov cl,0 mov dh,11 mov dl,37 int 10h ;第一个 左下块卷屏 mov al,0 mov bh,20h mov ch,12 mov cl,38 mov dh,24 mov dl,79右上块卷屏 int 10h ;第二个 mov al,0 mov bh,30h mov ch,0右下块卷屏 mov cl,38 mov dh,11 mov dl,79 int 10h ;第三个 结束 mov al,0 mov bh,40h mov ch,12 mov cl,0 mov dh,24 mov dl,37 int 10h ;第四个 mov ah,4ch int 21h ;返回DOScode ends end start实验心得:各种BIOS调用方便的解决了各种显示的基本操作,但是非基本的操作则需要通过各种基本的操作来组合得到。技术支持:Michael实验十九:内存统计实验目的:熟悉计算机存储器的访问方式,掌握DEBUG的用法。实验原理:计算机内存可以通过汇编语言直接访问获取其数据。实验内容:要求:分类统计内存FFF0H:0000H开始的100个字节单元中的字符0-9,英文字母(含大,小写字母)及其他字符的个数,分别存放于mn,ln,on单元中。DATAS SEGMENTnn db 0ln db 0on db 0DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATASSTART:mov cx,100h mov cx,100 MOV AX,DATAS MOV DS,AX MOV AX,0FFF0h MOV es,AX again: mov ax,0 mov ds,ax设置循环次数100开始 mov bx,cxdec bx mov bl,es:bx cmp bl,0 jl other ;不是数字是否是数字 cmp bl,9 jg next ;不是数字 inc nn ;是数字 nn+否 jmp over是 next:是否是字母 cmp bl,A jl other;不是大写字母 cmp bl,Z jg last ;不是大写字母是否 inc ln ;是字母 jmp overon加1 ln加1nn加1 last: cmp bl,a jl other;不是小写字母 cmp bl,z jg other ;不是小写字母CX减一 inc on ;是其他字符 on+ jmp over other: over:否 loop again MOV AH,4CHCX是否是0 INT 21H ;返回DOSCODES ENDSEND START是参考文献:结束IBM-PC汇编语言程序设计(第二版)技术支持:Michael实验二十:查询表实验目的:掌握运用查询表。实验原理:可以将数据表顺序存放在数据段中。实验内容:题目要求:编写一个查询表将十六进制数转化为十六进制数字的ASC码字符。代码:DATAS SEGMENTtable db 30313233343536373839,414243444546,$DATAS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS开始START: MOV AX,DATAS MOV DS,AX lea dx,table输入数字字符到AL mov ah,7 int 21hcmp al,0jl over ;比0小 不合法 结束输入是否合法cmp al,F否jg over ;比F大 不合法cmp al,3ah是jl goon ;在0-9之间 跳到gooncmp al,A是否在0-9jl over ;不属于A-F 不合法goon:是否 mov bh,0 cmp al,Aal减去Aal减去0 jl next mov bl,al sub bl,A ;A-F减去A add bl,bl add bl,20 ;加上20到A-F的区间打出查找表中al*2和al*2+1这两位的字符和H mov dl,bx mov ah,2 int 21h ;显示第一位 inc bl结束 mov dl,bx int 21h ;显示第二位 jmp over;跳到最后显示H next: mov bl,al sub bl,0 ;是数组 减去0 add bl,bl mov dl,bx mov ah,2 int 21h ;显示第一位 inc bl mov dl,bx int 21h ;显示第二位 over: mov dl,H mov ah,2 int 21h ;显示H MOV AH,4CH INT 21HCODES ENDS END START问题讨论:BUG:如果输入了不合法的数据,会显示一个孤立的H。可以把jl over的语句改写一下,加一个程序入口点,还可以加上错误输入的提示信息。技术支持:Michael参考文献:IBM-PC汇编语言程序设计(第二版)实验二十一:宏指令的应用实验目的:1. 掌握宏指令的使用。2. 进一步熟悉DOS系统调用方法。实验原理:宏调用可以减少重复功能代码量的编写。实验内容:在指定的窗口内输入字符。实验要求:学习并掌握宏的使用,完成一个在指定窗口内输入字符的宏的编码,并编写相应的程序对宏进行调用,并能将结构显示出来。(1) 窗口外框左上角为7行19列,右下角为19行51列,内框左上角坐标为8行20列,右下角坐标为18行50列,边框为品红色,底色为绿色,字符为白色。(2) 程序运行后,光标定位于18行20列处,等待输入。当输入慢30个字符,则自动上卷一行,光标仍然回到开始位置,窗口在最高一行向上卷动后消失。代码:DATAS SEGMENT ;此处输入数据段代码 DATAS ENDSSTACKS SEGMENTdw 20 dup(?) STACKS ENDSinputword macro num ;宏的定义 mov ah,2h mov bh,0 mov dh,18 mov dl,20 int 10h;光标定位 mov cx,31 again&num:mov ah,1int 21h ;输入30个字符,也就是一行loop again&num mov ah,6h mov al,1mov bh,2Fhmov ch,8开始mov cl,20mov dh,18mov dl,50int 10h;上卷一行endm外框设置CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS内框设置 MOV DS,AX mov ah,6 mov al,0 mov bh,50h mov ch,7 mov cl,19利用宏的10次调用,输入10行字符,没输入完一行后上卷,并把光标复位。 mov dh,19 mov dl,51 int 10h ;外框设置 mov bh,2Fh mov ch,8 mov cl,20 mov dh,18 mov dl,50 int 10h;内框设置结束 inputword 1;宏的调用 inputword 2 inputword 3 inputword 4 inputword 5 inputword 6 inputword 7 inputword 8 inputword 9 inputword 0 MOV AH,4CH INT 21H;返回DOSCODES ENDS END START结果分析:在主程序中写入宏的名字,执行宏调用,可以实现宏里面所定义的功能。实验心得:宏的展开其实就是一个替换的过程,是在编译的时候就实现的,它姿势减少的代码的编写量,不同于子函数,宏在计算机看来依然是大量的重复代码,所以在编写的过程中一定要注意宏定义时一定要区别变量。比如在该程序中的宏里面循环所用到的节点就必须要特别的加一区别again&num。不然多个宏展开之后会产生错误。问题讨论:本题可以用子函数代替宏来实现相同的功能吗?可以,子函数和宏都能够达到减小代码量的作用,只是宏是在编译的时候就展开,而子程序是在运行时调用。本题可以用如下子函数来实现相同功能:inputword proc mov ah,2h mov bh,0 mov dh,18 mov dl,20 int 10h mov cx,31 again:mov ah,1int 21hloop again mov ah,6h mov al,1mov bh,2Fhmov ch,8mov cl,20mov dh,18mov dl,50int 10hinputword endp参考文献:IBM-PC汇编语言程序设计(第二版)技术支持:Michael实验二十二:字符串搜索实验目的:1. 进一步熟悉汇编语言的开发方法和过程。2. 掌握汇编语言程序设计中字符串搜索的基本方法。实验原理:利用DOS的0ah号功能可以将字符串顺序的存入数据段中,该段的第一个单元存放的是最大字符数,第二个单元存放的是实际字符数。字符串的匹配可以以母串为基本,从第一个字符开始匹配,如果不成功则以下一个字符为开始位置匹配。实验内容:程序接收用法输入的一个关键字及一个句子。如果句子中不包含关键字则显示No match,如果句子中包含关键字则显示Match 且把该句子中的位置用十六进制数显示出来。代码:DATAS SEGMENTmessage db 100,?,100 dup($)search db 31,30,?, 30 dup($)startword db enter keyword:,13,10,$nextword db 13,10,enter sentence:,13,10,$nextline db 13,10,$match db match,13,10,$nomatch db no match,13,10,$DATAS ENDSSTACKS SEGMENTdb 20 dup(?) ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSmain proc MOV AX,DATAS MOV DS,AXsearchbegin:mov ah,09hlea dx,startword ;显示开始提示信息int 21h mov ah,0ah lea dx,search int 21h ;输入关键字开始 mov ah,09hlea dx,nextword输入关键字int 21h ;显示句子输入提示 mov ah,0ah输入句子 lea dx,message int 21h;输入句子 SI置1,从句子第一为开始查找 mov ah,09h lea dx, nextline int 21h否SI加一 mov si,1SI是否等于句子长度 push si again: pop si否是 inc si ;从句子的下一位置匹配 push siDi置2,从关键字第一位开始匹配 mov bl,message+1 mov bh,0否判断句子第 位和子串第DI位是否相同。 add bx,3 cmp si,bx jz nosame mov di,2 Di加一 mov cl,search+1 mov ch,0 continue:否 mov bl,message+siDI是否等于关键字长度 cmp bl,search+di jnz again ;不匹配 inc di ;匹配下一字符否 inc si输出匹配信息输出不能匹配信息 loop continue pop bx dec bx是否摁下ESC call binihex ;显示匹配位置 lea dx,match jmp over nosame:结束 lea dx,nomatch over:
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!