汇编实验
- 格式:doc
- 大小:569.50 KB
- 文档页数:29
实验一用表格形式显示字符一、实验目的用表格形式显示ASCII字符SMASCII二、实验要求按15*16列的表格形式显示ASCⅡ码为10H—100H的所有字符,即以行为主的顺序及ASCⅡ码递增的次序依次显示对应的字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符隔开。
三、实验步骤(1)显示每个字符可使用功能号为02的显示输出功能调用:Mov ah,02hMov dl,输出字符的ASCⅡ码int 21h将dl初始化为10H,然后使用其加1(inc)以取得下一个字符的ASCⅡ码。
(2)显示空白符时,用其ASCⅡ码置0入dl寄存器。
每行结束时,用回车(0dh)和换行(0ah)来结束本行并开始下一行。
(3)由于逐个显示相继的ASCⅡ码字符是,需要不断修改dl寄存器的内容,而显示空白、回车、换行也需要使用dl寄存器,为此可使用堆栈保存相继的ASCII 字符。
具体用法是:在显示空白或回车,换行符前用指令。
PUSH DX 把DL的内容保存到堆栈中去;在显示空白或回车,换行符后用指令,POP DX 恢复DL寄存器的原始内容。
四、实验程序及结果源程序:DATAS SEGMENTDATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DA TASMOV DS,AXmov cl,15mov ch,16mov dh,10ha0:mov ah,02hmov dl,dhint 21hinc dhpush dxmov ah,02hmov dl,00hint 21hpop dxdec chcmp ch,0jz a1jmp a0a1:mov ch,16mov ah,02hmov dl,0dhint 21hmov ah,02hmov dl,0ahint 21hdec clcmp cl,0jz exitjmp a0exit:MOV AH,4CHINT 21HCODES ENDSEND START实验结果:五、实验总结1本实验程序设计中需要多次显示回车,空格,换行字符,所以在程序设计中如果不使用模块设计方法,将会使程序非常冗长。
所以本实验在编写程序时把需要反复显示的字符用一个字程序来实现,当需要显示字符时,只需对入口参数正确赋值,然后调用子程序,这样使程序简洁、清晰明了。
2需要特别注意的是在调用子程序时,如果存放入口参数值的寄存器在程序的其他地方需要用到时,那么在调用子程序之前一定要对该寄存器压栈保护,否则将会影响程序结果的正确性。
本实验的中,DX中存放的是ASCII字符的十六进制值,且程序每执行一次,DX加一,指向下一个ASCII字符,而在调用子程序显示空格、回车、换行时需要对DX赋相应的值,因此在调用子程序时需先对DX 压栈保护,调用结束后恢复DX的值。
实验二查找、匹配字符串一、实验目的输入一个关键字,然后在随后输入的句子中查找是否存在匹配的子串,如果存在就输出匹配的位置,主要联系循环调用子程序来完成上述目的。
二、实验要求(1)编写一个程序,接受用户输入的一个关键字(2)提示用户输入新的字符串,在字符串中查找和定位关键字的位置,(3)如果定位成功则输出Match,并用十六进制显示出关键字的位置否则输出 No match。
三、实验步骤(1)输入关键字和一个句子,分别存入相应的缓冲区中。
可用功能调用0AH。
(2)在句子中查找关键字:a、关键字和句子中相应字段的比较可使用串比较指令。
为此必须定义附加段,但附加段和数据段可以定义为同一段,以便于串指令的使用,相应的寄存器内容也有了确定的含义,即如下:SI 寄存器为关键字的指针DI 寄存器为句子中正相比较的字段的指针CX 寄存器存放关键字的字母个数(长度)b、整个句子和关键字的比较过程可以用一个循环结构来完成,循环次数为:(句子长度-关键字长度)+1在计算循环次数时,如遇到句子长度小于关键字长度的情况则应转向显示“no match”,循环中还需要用到BX寄存器,它用来保存句子中当前正在比较字段的首地址。
c、输出信息:用功能调用09h分“找到”或“找不到”两种情况分别显示不同的信息。
在“找到”时,还要求显示出匹配字符串在句子中的位置,在“找到”时BX寄存器的内容为匹配字符串的首地址,将此值减到句子的首地址,再将差值加1 即是所要的匹配字符串在句子中的位置,可将位置转换为十六进制数从屏幕上显示出来。
流程图:四、实验程序及结果NYYY输入关键字结束关键字长度=0输入句子句子长度<关键字长度Y保存关键字长度到cx ,cx 入栈,保存总循环次数(句子长度-关键字长度+1)到al ,将句子的首地址放进bx(作为基址寄存器) si=di=0(变址寄存器)开始比较[bx+di]与[si]是否相等si+1,di+1,cx-1(同时指向下一个字符) YNbx+1(句子指向下一个字符) cx 出栈,再入栈,si,di 清零,al-1cx 是否为0 N匹配完成,调用子程序输出al 是否为0不匹配,输出源程序:DATAS SEGMENTstring1 db'enter sentence:','$'string2 db'enter keywork:','$'change db 13,10,'$'sentence label bytemax db 100act db?sen db 100 dup(?)keyword label bytekmax db 10kact db?key db 10 dup(?)mess1 db'match at the location:','$'mess10 db'H of the sentence',13,10,'$'mess2 db'no match!',13,10,'$';此处输入数据段代码DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DA TASMOV DS,AXmov es,axk:lea dx,string2mov ah,09hint 21hlea dx,keywordmov ah,0ahint 21hlea dx,changemov ah,09hint 21hs:lea dx,string1mov ah,09hint 21hlea dx,sentencemov ah,0ahint 21hcmp act,0je exitlea dx,changemov ah,09hint 21hmov al,kactcmp act,aljb exitsub cx,cxmov bx,0a1:mov cl,kactlea si,keylea ax,senadd al,blmov di,axcldrepz cmpsbjz matchinc blcmp bl,actje nomatchjmp a1match:lea dx,mess1mov ah,09hint 21hcall binihexlea dx,mess10mov ah,09hint 21hjmp knomatch:lea dx,mess2mov ah,09hint 21hjmp sexit:MOV AH,4CHINT 21H binihex proc nearmov ch,2rotate:mov cl,4rol bl,clmov al,bland al,0fhadd al,30hcmp al,3ahjl printadd al,7hprint:mov dl,almov ah,2int 21hdec chjnz rotateretbinihex endp CODES ENDSEND START 实验结果:五、实验总结1D命令可以查看定义数据段在内存中的内容。
2匹配由串指令完成。
一次比较字符数为关键字个数。
一次比较后为指向句子指针后移。
比较次数为句子长度减去关键字长度在加1。
3输出结果采用十六进制输出在《IBM PC汇编语言程序设计》一书中例6.3decihex 中的子过程binihex,这里也提醒我要注意积累一些知识,记忆一些常用的程序段。
实验三分类统计字符个数一、实验目的学习用汇编语言编写与设计分支循环程序。
二、实验要求程序接受用户键入的一行字符(字符数不超过80个,该字符串用回车符结束),并按字母,数字,其他字符分类计数,然后将结果存入以letter,digit 和other为名的存储单元中。
程序可0AH功能调用把键入字符直接送到缓冲区中,然后再逐个取出分类计数。
也可01H功能调用在接收字符后先分类计数再存入缓冲区中。
三、实验程序及结果源程序:DATAS SEGMENTstring1 db'enter any char:','$'change db 13,10,'$'mess1 db'other:','$'mess2 db'letter:','$'mess3 db'digit:','$'char label bytemax db 80act db?stokn db 80 dup(?)letter db 80 dup(?)digit db 80 dup(?)other db 80 dup(?)other1 db 0DATAS ENDSSTACKS SEGMENTa dw 20 dup(?);此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXlea dx,string1mov ah,09hint 21hlea dx,charmov ah,0ahint 21hlea dx,changemov ah,09hint 21hsub ax,axsub bx,bxsub cx,cxsub dx,dxa0:lea si,stoknadd si,bxmov al,30hcmp [si],aljb othercmov al,40hcmp [si],aljb digitcmov al,41hcmp [si],aljb othercmov al,5bhcmp [si],aljb lettercmov al,61hcmp [si],aljb othercmov al,7bhcmp [si],aljb lettercjmp othercb:cmp bl,actjz exitjmp a0otherc:inc blinc other1mov dl,[si]lea di,otheradd di,cxmov [di],dlinc cljmp bletterc:inc blinc letter1mov dl,[si]lea di,letteradd di,cxmov [di],dlinc cljmp bdigitc:inc bllea di,digitadd di,cxmov [di],dlinc cljmp bexit:lea dx,mess1mov ah,09hint 21hmov al,other1call displaylea dx,changemov ah,09hint 21hlea dx,mess2mov ah,09hint 21hmov al, letter1call displaylea dx,changemov ah,09hint 21hlea dx,mess3mov ah,09hint 21hmov al,digit1call displaylea dx,changemov ah,09hint 21hMOV AH,4CHINT 21Hdisplay proc near ;输出结果push cxpush dxmov ah,0mov cl,10div clmov dl,almov dh,ahmov ah,02hadd dl,30hint 21hmov dl,dhmov ah,02hadd dl,30hint 21hpop dxpop cxretdisplay endpCODES ENDSEND START实验结果五、实验总结编写程序主要用0ah号功能输入字符串,同时练习设计分支结构的程序,为以后的编程打下基础。