当前位置:文档之家› 汇编语言上机试验指导

汇编语言上机试验指导

作实验2 【1】.有空加作实验【4】(1).实验2 算术及位串处理程序【1】.在数据段预先存放16个十六进制数的ASCII码,把BX中的四位十六进制数,从左到右用查表的方法找到对应数位的ASCII码,并取出显示出来。

要求见书:参考程序:data segmentasc db 30h,31h,32h,33h,34h,35h,36h,37h,38h,39hdb 41h,42h,43h,44h,45h,46hdata endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axmov cl,4rol bx,clmov si,bxand si,0fhmov dl,[asc+si]mov ah,2int 21hrol bx,clmov si,bxand si,0fhmov dl,[asc+si]mov ah,2int 21hmov ah,4chint 21hcode endsend start【2】用字符串处理指令编制程序,处理字符串的比较和查找,显示结果。

要求:(1) 字符串的比较程序中,一个字符串在数据段定义,另一个字符串在程序执行时从键盘输入,必须定义键盘缓冲区。

并指出不相等的位置。

参考书上例3.51,题目改为MESS2 定义为从键盘输入缓冲区,键盘输入缓冲区定义:mess2 DB 9,?,9 DUP(?)例3.51 在数据段中有一个长度为19的字符串MESS1,在附加段中有一个长度为19的字符串MESS2,比较它们是否相等。

若相等显示‘Y’,否则显示‘N’。

编制程序如下所示。

data segmentmess1 db ‘computer software $’data endsext segmentmess2 db ‘comkuter software $’ext endscode segmentassume cs:code,ds:data,es:extstart:mov ax, datamov ds, axmov ax, extmov es, axlea si, mess1lea di, mess2mov cx, 19cldrepe cmpsbjz yes ;如果zf=1跳转到标号yesmov dl,‘n’jmp disp ;跳转到标号dispyes: mov dl,‘y’disp:mov ah,2int 21hmov ah, 4chint 21hcode endsend start实验3 分支程序设计实验目的:掌握分支与循环程序等基本编程方法。

熟悉数制转换。

用LOOP指令、条件转移指令和跳跃表法实现程序转移。

实验内容:【1】分离字数组ARRAY中的正、负数,把其中的正数复制到PDATA数组;负数复制到NDATA数组,并分别统计正、负数个数。

要求:三个数组的占用单元数应一致。

通过DEBUG跟踪程序的执行,检查运行结果:是否完成分离。

参考程序:data segmentarray dw 2,-2,3,-3,4,-4,5,0,0org 10hpdata dw 7 dup (?)org 20hndata dw 7 dup (?)org 30hp db 0n db 0data endscode segmentassume cs:code,ds:datastart:mov ax,datamov ds,axlea bx,arraylea si,pdatalea di,ndatamov cx,7kk:mov ax,[bx]test ax,8000hjz zs。

jmp nextzs:。

next:add bx,2loop kkmov dl,padd dl,30hmov ah,2int 21hmov dl,nadd dl,30hmov ah,2int 21hmov ah,4chint 21hcode endsend start【2】在数据段定义分支地址表,通过键盘输入数字1~8,实现转移。

要求:(1) 分支表定义如下:PTABLE DW P1,P2,P3,P4,P5,P6,P7,P8(2) P1~P8为标号,如果键盘输入数字3,则从分支地址表PTABLE中取出P3的地址,实现间接转移,标号处的指令只是显示一个信息。

参看例5.3例5.3根据键盘输入的一位数字(0~3),使程序转移到4个不同的分支中去。

算法分析:建立一个地址表,集中存放4个分支的偏移地址,因偏移地址为16位,所以每两个字节存放一个偏移地址。

根据输入的数字指向地址表,从地址表中取出对应分支的偏移地址,以间接寻址方式转向对应分支。

例5.3程序如下:code segmentassume cs:code,ds:codestart: mov ax,code ;ds=csmov ds,axmov ah,7 ;键盘输入无回显int 21hcmp al,30hjl exit ;非法输入cmp al,33hjg exit ;非法输入mov dl,al ;放入dl,待显示mov ah,2sub al,30h ;转换ascii码为数值shl al,1 ;(al)×2,指向地址表中某地址mov bl,almov bh,0jmp branch[bx] ;转向分支rout0: int 21h ;显示键盘输入的数字jmp exitrout1: int 21hjmp exitrout2: int 21hjmp exitrout3: int 21hjmp exitexit: mov ah,4ch ;程序终止并退出int 21hbranch dw rout0dw rout1dw rout2dw rout3code endsend start该程序在代码段的最后定义了地址表,汇编程序进行汇编时,各标号的有效地址可以确定,地址表首地址BRANCH的有效地址可以确定,其后定义的4个字的值就是四个分支标号的有效地址。

该程序也可以定义一个数据段,并把地址表BRANCH定义在数据段。

用地址表方法处理多分支程序,可以简单直接地实现分支的转移,避免了大量的比较和条件转移指令,使程序显得简洁紧凑。

实验4 循环程序设计实验目的:掌握和提高循环程序编程技巧,熟悉键盘输入、显示输出等基本人机交互。

【1】从键盘输入7位二进制数,显示对应的字符,回车键退出循环,终止程序。

参考程序:code segmentassume cs:codestart:mov cx,7mov dl,0next:shl dl,1mov ah,1int 21h。

loop nextmov ah,2int 21hmov ah,4chint 21hcode endsend start【2】从键盘输入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序。

DEBUG下跟踪,注意结果。

参看例5.7,程序的核心是斜体部分,要求修改程序中的斜体部分,当然其它关联部分也需修改。

例5.7 从键盘输入一个单个字符,显示该字符的ASCII码(十六进制),回车键退出循环,终止程序。

算法分析:用1号功能调用从键盘输入一个单个字符时,该字符ASCII码在AL中,为两位十六进制数,而要显示这两位十六进制数,则要把每位十六进制数位转换成ASCII码才能用2号功能调用显示。

高位十六进制数位为数字,低位十六进制数位为数字或A~F。

该循环程序的循环终止条件是输入回车键。

流程图如图5.7所示:图5.7 例5.7流程图例5.7程序如下:code segmentassume cs:codestart: mov ah,1 ;输入字符int 21hcmp al,13je exit ;回车键则退出循环mov bl,al ;保存到BLmov cl,4 ;把2位十六进制数转换成的2个ascii码shl bx,cland bx,0f00hadd bh,30hand al,0fhadd al,30hmov ah,0cmp ax,39hjle l2l1:add ax,7l2:add bx,axmov dl,bh ;显示高位ascii码mov ah,2int 21hmov dl,bl ;显示低位ascii码mov ah,2int 21hjmp start;转循环入口exit:mov ah,4chint 21hcode endsend start实验5 子程序设计实验目的:掌握通用子程序的设计方法,合理划分子程序功能和正确进行子程序的参数传递。

【1】采用通过地址表传递参数地址的方法,求数组元素累加和的通用子程序。

该通用子程序能处理字节类型或字类型的数组元素。

参看例6.5例6.5采用通过地址表传递参数地址的方法,求数组元素累加和的通用子程序(不考虑溢出)。

data segmentary dw 100 dup(4) ;设元素值是4num dw 100 ;设元素个数是100sum dw ?table dw 3 dup(?) ;地址表3个字data endscode segmentassume cs:code,ds:datamain proc farpush dsxor ax,axpush axmov ax,datamov ds,axmov table, offset ary ;ary地址送table mov table+2, offset num ;元素个数的地址送table+2mov table+4, offset sum ;存放和的地址送table+4 lea bx, table ;table的首地址送bxcall prosumretmain endp;------------------------prosum proc nearmov si, [bx] ;ary地址送si mov di, [bx+2] ;取元素个数的地址mov cx,[di] ;元素个数送cxmov di,[bx+4] ;存放和的地址送dixor ax, axnext: add ax, [si]add si, 2loop nextmov [di], axretprosum endpcode endsend main程序中在数据段建立一个三个字的地址表TABLE,主程序把数组ARY的三个参数的地址依此放入地址表TABLE中,并把地址表TABLE的首地址放入BX寄存器。

子程序PROSUM通过BX寄存器间接取得数组ARY的首地址、元素个数和存放累加和的地址,实现数组元素的累加。

由于子程序中没有出现具体的数组参数,所以对其它数组求和也是可行的。

但该程序只能处理字类型的数组元素,如果希望子程序PROSUM也能处理字节类型的数组元素,那么可以增加一个公用的类型参数,类型参数可用一个变量也可用一个常量说明。

相关主题