版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显
示出来。
答:程序段如下:
BEGIN:MOVAH,1;从键盘输入一个字符的DOS调用
INT21H
CMPAL,'a';输入字符<'a’吗?
JBSTOP
CMPAL,<z,;输入字符》”吗?
JASTOP
SUBAL,20H;转换为大写字母,用ANDAL,11011111B也可
MOVDL,AL;显示一个字符的DOS调用
MOVAH,2
INT21H
JMPBEGIN
STOP:RET
5.2编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续
字符,再按依次显示这三个字符。
答:程序段如下:
BEGIN:MOVAH,1;从键盘输入一个字符的DOS调用
INT21H
CMPAL,'a';输入字符<'a’吗?
JBSTOP
CMPAL,'z';输入字符〉'z'吗?
JASTOP
DECAL;得到前导字符
MOVDL,AL;准备显示三个字符
MOVCX,3
DISPLAY:MOVAH,2;显示一个字符的DOS调用
INT21H
INCDL
LOOPDISPLAY
STOP:RET
5.3将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别
放在AL、BL、CL和DL中。
答:程序段如下:
DSEGSEGMENT
STOREDB4DUP(?)
DSEGENDS
I
I
I
BEGIN:MOVCL,4;右移四次
MOVCH,4;循环四次
LEABX,STORE
A10:MOVDX,AX
ANDDX,OFH;取AX的低四位
MOV[BX],DL;低四位存入STORE中
INCBX
SHRAX,CL;右移四次
DECcn
JNZA10;循环四次完了码?
BIO:MOVDL,STORE;四组数分别放在AL、BL、CL和DL中
MOVCL,STORE+1
MOVBL,STORE+2
MOVAL,STORE+3
STOP:RET
5.4试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是
否完全相同,若相同则显示'MATCH',若不相同则显示'NOMATCH'。
答:程序如下:
DSEGSEGMENT
STRING1DB(Iamastudent.J
STRING2DB'Iamastudent!'
YESDB'MATCH',ODH,OAH,'$'
NODB'NOMATCH',ODH,OAH,'$'
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG,ES:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
MOVES,AX;给ES赋值
BEGIN:LEASI,STRING1;设置串比较指令的初值
LEADI,STRING2
CLD
MOVCX,STRING2-STRING1
REPECMPSB;串比较
JNEDISPNO
LEADX,YES;显示MATCH
JMPDISPLAY
DISPNO:LEADX,NO;显示NOMATCH
DISPLAY:MOVAH,9;显示一个字符串的DOS调用
INT21H
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.5试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次(响铃
的ASCH码为07)。
答:程序段如下:
BEGIN:MOVAH,1;从键盘输入一个字符的DOS调用
INT21H
SUBAL,'O'
JBSTOP;输入字符<'O’吗?
CMPAL,9;输入字符》‘9'吗?
JASTOP
CBW
MOVCX,AX;响铃次数N
JCXZSTOP
BELL:MOVDL,07H;准备响铃
MOVAH,2;显示一个字符的DOS调用,实际为响铃
INT21H
CALLDELAY100ms;延时100ms
LOOPBELL
STOP:RET
5.6编写程序,将一个包含有20个数据的数组M分成两个数组:正数数
组P和负数数组N,并分别把这两个数组中数据的个数显示出来。
答:程序如下:
DSEGSEGMENT
COUNTEQU20
ARRAYDW20DUP(?);存放数组
COUNT1DB0;存放正数的个数
ARRAY1DW20DUP(?);存放正数
C0UNT2DB0;存放负数的个数
ARRAY2DW20DUP(?);存放负数
ZHENDB0D1I,OAH,'Thepositivenumberis:','$';正数的个
数是:
FUDBODU,OAH,'Thenegativenumberis:','$';负数的个数
是:
CRLFDBODH,OAH,'$'
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVCX,COUNT
LEABX,ARRAY
LEASI,ARRAY1
LEADI,ARRAY2
BEGIN1:MOVAX,[BX]
CMPAX,0;是负数码?
JSFUSHU
MOV[SI],AX;是正数,存入正数数组
INCCOUNT1;正数个数+1
ADDSI,2
JMPSHORTNEXT
FUSHU:MOV[DI],AX;是负数,存入负数数组
INCCOUNT2;负数个数+1
ADDDI,2
NEXT:ADDBX,2
LOOPBEGIN1
LEADX,ZHEN;显示正数个数
MOVAL,COUNT1
CALLDISPLAY;调显示子程序
LEADX,FU;显示负数个数
MOVAL,COUNT2
CALLDISPLAY;调显示子程序
RET
MAINENDP
DISPLAYPROCNEAR;显示子程序
MOVAH,9;显示一个字符串的DOS调用
INT21H
AAM;将(AL)中的二进制数转换为二个非压缩BCD码
ADDAH,'O';变为0〜9的ASCII码
MOVDL,AH
MOVAH,2;显示一个字符的DOS调用
INT21H
ADDAL,<0,;变为0〜9的ASCH码
MOVDL,AL
MOVAH,2;显示一个字符的DOS调用
INT21H
LEADX,CRLF;显示回车换行
MOVAH,9;显示一个字符串的DOS调用
INT21H
RET
DISPLAYENDP;显示子程序结束
CSEGENDS;以上定义代码段
ENDSTART
5.7试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最
小偶数,并把它存放在AX中。
答:程序段如下:
BEGIN:MOVBX,0
MOVCX,100
COMPARE:MOVAX,DATA[BX];取数组的第一个偶数
ADDBX,2
TESTAX,01H;是偶数吗?
LOOPNZCOMPARE;不是,比较下一个数
JNZSTOP;没有偶数,退出
JCXZSTOP;最终一个数是偶数,即为最小偶数,退出
COMPARE1:MOVDX,DATA[BX];取数组的下一个偶数
ADDBX,2
TESTDX,01H;是偶数吗?
JNZNEXT;不是,比较下一个数
CMPAX,DX;(AX)<(DX)吗?
JLENEXT
MOVAX,DX;(AX)<(DX),则置换(AX)为最小偶数
NEXT:LOOPCOMPARE1
STOP:RET
5.8把AX中存放的16位二进制数K看作是8个二进制的“四分之一字
节”。试编写程序要求数一下值为3(即11B)的四分之一字节数,并将该
数(即11B的个数)在终端上显示出来。
答:程序段如下:
BEGIN:MOVDL,0;计数初始值
MOVCX,8
COMPARE:TESTAX,03H;是数03吗?
JNZNOEQUAL;不是,转走
INCDL;是,计数
NOEQUAL:RORAX,1;准备推断下一个数
RORAX,1
LOOPCOMPARE
ADDDL,'O';将计数值转换为ASCH码
MOVAH,2;进行显示
INT21H
STOP:RET
5.9试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,
并在终端上显示与它等值的二进制数。
答:程序段如下:
BEGIN:MOVBX,0;用于存放四位的16进制数
MOVCH,4
MOVCL,4
INPUT:SHLBX,CL;将前面输入的数左移4位
MOVAH,1;从键盘取数
INT21H
CMPAL,30H;<0吗?
JBINPUT;不是‘0〜F'的数重新输入
CMPAL,39H;是'0〜9'吗?
JAAF;不是,转'A〜F'的处理
ANDAL,OFH;转换为:OOOOB-1OO1B
JMPBINARY
AF:ANDAL,11011111B;转换为大写字母
CMPAL,41H;又〈A吗?
JBINPUT;不是'A〜F'的数重新输入
CMPAL,46H;>F吗?
JAINPUT;不是‘A〜F'的数重新输入
ANDAL,OFH;转换为:1010B-1111B
ADDAL,9
BINARY:ORBL,AL;将键盘输入的数进行组合
DELCH
JNZINPUT
DISPN:MOVCX,16;将16位二进制数一位位地转换成ASCH码显示
DISP:MOVDL,0
ROLBX,1
RCLDL,1
ORDL,30H
MOVAH,2;进行显示
INT21H
LOOPDISP
STOP:RET
5.10设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程
序,查对单词SUN在该文中的出现次数,并以格式“SUN:xxxx”显示出
次数。
答:程序如下:
DSEGSEGMENT
ENGDB'Hereissun,sun「••,$'
DISPDB'SUN:'
DATDB'0000',ODH,OAH,'$'
KEYWORDDBsun
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG,ES:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
MOVES,AX;给ES赋值
BEGIN:MOVAX,0
MOVDX,DISP-ENG-2;计算ENG的长度(每次比较sun,因此比较次数-2)
LEABX,ENG
COMP:MOVDI,BX
LEASI,KEYWORD
MOVCX,3
REPECMPSB;串比较
JNZNOMATC11
INCAX;是,SUN的个数加1
ADDBX,2
NOMATCH:INCBX;指向ENG的下一个字母
DECDX
JNZCOMP
DONE:MOVCH,4;将次数转换为16进制数的ASCH码
MOVCL,4
LEABX,DAT;转换结果存入DAT单元中
DONE1:ROLAX,CL
MOVDX,AX
ANDDL,OFH;取一位16进制数
ADDDL,30H
CMPDL,39H
JLESTORE
ADDDL,07H;是“A〜F”所以要加7
STORE:MOV[BX],DL;转换结果存入DAT单元中
INCBX
DECCH
JNZDONE1
DISPLAY:LEADX,DISP;显示字符串程序(将DISP和DAT一起显示)
MOVAH,0911
INT21H
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.11从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符
计数,并显示出计数结果。
答:程序段如下:
DSEGSEGMENT
BUFFDB50DUP('')
COUNTDW0
DSEGENDS
I
I
I
BEGIN:LEABX,BUFF
MOVCOUNT,0
INPUT:MOVAH,01;从键盘输入一个字符的功能调用
INT21H
MOV[BX],AL
INCBX
CMPAL,'$';是$结束符吗?
JNZINPUT;不是,接着输入
LEABX,BUFF;对非数字字符进行计数
NEXT:MOVCL,[BX]
INCBX
CMPCL,'$';是$结束符,则转去显示
JZDISP
CMPCL,30U;小于0是非数字字符
JBNEXT
CMPCL,39H;大于9是非数字字符
JANEXT
INCCOUNT;个数+1
JMPNEXT
DISP::;16进制数显示程序段(省略)
5.12有一个首地址为MEM的100D字数组,试编制程序删除数组中全部为
0的项,并将后续项向前压缩,最终将数组的剩余部分补上0。
答:程序如下:
DSEGSEGMENT
MEMDW100DUP(?)
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVSI,(100-1)*2;(SI)指向MEM的末元素的首地址
MOVBX,-2;地址指针的初值
MOVCX,100
COMP:ADDBX,2
CMPMEM[BX],0
JZCONS
LOOPCOMP
JMPFINISH;比较完了,已无0则结束
CONS:MOVDI,BX
C0NS1:CMPDI,SI;到了最终单元码?
JAENOMOV
MOVAX,MEM[DI+2];后面的元素向前移位
MOVMEM[DI],AX
ADDDI,2
JMPC0NS1
NOMOV:MOVWORDPTR[SI],0;最终单元补0
LOOPCOMP
FINISH:RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.13在STRING到STRING+99单元中存放着一个字符串,试编制一个程序
测试该字符串中是否存在数字,如有则把CL的第5位置1,否则将该位置
Oo
答:程序如下:
DSEGSEGMENT
STRINGDB100DUP(?)
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVSI,0;(SI)作为地址指针的变更值
MOVCX,100
REPEAT:MOVAL,STRING[SI]
CMPAL,30H
JBGO_ON
CMPAL,39H
JAGO_ON
ORCL,20H;存在数字把CL的第5位置1
JMPEXIT
GO_ON:INCSI
LOOPREPEAT
ANDCL,ODFH;不存在数字把CL的第5位置0
EXIT:RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.14在首地址为TABLE的数组中按递增次序存放着10011个16位补码数,
试编写一个程序把出现次数最多的数与其出现次数分别存放于AX和CX
中。
答:程序如下:
DSEGSEGMENT
TABLEDW100HDUP(?);数组中的数据是按增序排列的
DATADW?
COUNTDW0
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVCX,100H;循环计数器
MOVSI,0
NEXT:MOVDX,0
MOVAX,TABLE[SI]
COMP:CMPTABLE[SI],AX;计算一个数的出现次数
JNEADDR
INCDX
ADDSI,2
LOOPCOMP
ADDR:CMPDX,COUNT;此数出现的次数最多吗?
JLEDONE
MOVCOUNT,DX;目前此数出现的次数最多,登记次数
MOVDATA,AX;登记此数
DONE:LOOPNEXT;准备取下一个数
MOVCX,COUNT;出现最多的次数存入(CX)
MOVAX,DATA;出现最多的数存入(AX)
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.15数据段中已定义了一个有n个字数据的数组M,试编写一程序求出M
中确定值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地
址存放在M+2(n+1)单元中。
答:程序如下:
DSEGSEGMENT
nEQU100H;假设n=100H
MDWnDUP(?)
DATADW?;M+2n单元
ADDRDW?;M+2(n+l)单元
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVCX,n;循环计数器
LEADI,M
MOVAX,[DI];取第一个数
MOVADDR,DI;登记确定值最大的数的地址
CMPAX,0;此数是正数吗?
JNSZHEN;是正数,即为确定值,转去推断下一个数
NEGAX;不是正数,变为其确定值
ZHEN:MOVBX,[DI]
CMPBX,0;此数是正数吗?
JNSCOMP;是正数,即为确定值,转去比较确定值大小
NEGBX;不是正数,变为其确定值
COMP:CMPAX,BX;推断确定值大小
JAEADDRESS
MOVAX,BX;(AX)<(BX),使(AX)中为确定值最大的数
MOVADDR,DI;登记确定值最大的数的地址
ADDRESS:ADDDI,2
LOOPZHEN
MOVDATA,AX;登记此数
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.16在首地址为DATA的字数组中存放着10011个16位补码数,试编写一
个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小
于此平均值,将结果放在BX寄存器中。
答:程序如下:
DSEGSEGMENT
DATADW100UDUP(?)
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVCX,100II;循环计数器
MOVSI,0
MOVBX,0;和((DI),(BX))的初始值
MOVDI,0
NEXT:MOVAX,DATA[SI]
CWD
ADDBX,AX;求和
ADCDI,DX;加上进位位
ADDSI,2
LOOPNEXT
MOVDX,DI;将((DI),(BX))中的累加和放入((DX),(AX))中
MOVAX,BX
MOVCX,100H
IDIVCX;带符号数求平均值,放入(AX)中
MOVBX,0
MOVSI,0
COMP:CMPAX,DATA[SI];找寻小于平均值的数
JLENO
INCBX;小于平均值数的个数+1
NO:ADDSI,2
LOOPCOMP
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.17试编制一个程序把AX中的16进制数转换为ASCII码,并将对应的
ASCH码依次存放到MEM数组中的四个字节中。例如,当(AX)=2A49H时,
程序执行完后,MEM中的4个字节内容为39H,34H,41H,32H。
答:程序如下:
DSEGSEGMENT
MEMDB4DUP(?)
NDW2A49H
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVCH,4;循环计数器
MOVCL,4
MOVAX,N
LEABX,MEM
ROTATE:MOVDL,AL;从最低四位起先转换为ASCII码
ANDDL,OFH
ADDDL,30H
CMPDL,3AH;是0~9吗?
JLNEXT
ADDDL,07H;是A~F
NEXT:MOV[BX],DL;转换的ASCH码送入MEM中
INCBX
RORAX,CL;准备转换下一位
DECCH
JNZROTATE
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.18把O^IOOD之间的30个数存入以GRADE为首地址的30字数组中,
GRADE+i表示学号为i+1的学生的成果。另一个数组RANK为30个学生的
名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,
依据GRADE中的学生成果,将学生名次填入RANK数组中。(提示:一个学
生的名次等于成果高于这个学生的人数加1。)
答:程序如下:
DSEGSEGMENT
GRADEDW30DUP(?);假设已预先存好30名学生的成果
RANKDW30DUP(?)
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVDI,0
MOVCX,30;外循环计数器
L00P1:PUSHCX
MOVCX,30;内循环计数器
MOVSI,0
MOVAX,GRADE[DI]
MOVDX,1;起始名次为第1名
L00P2:CMPGRADE[SI],AX;成果比较
JBEGO_ON
INCDX;名次+1
GO_ON:ADDSI,2
LOOPL00P2
POPCX
MOVRNAK[DI],DX;名次存入RANK数组
ADDDI,2
LOOPLOOP1
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.19已知数组A包含15个互不相等的整数,数组B包含20个互不相等
的整数。试编制一程序把既在A中又在B中出现的整数存放于数组C中。
答:程序如下:
DSEGSEGMENT
ADW15DUP(?)
BDW20DUP(?)
CDW15DUP('')
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVSI,0
MOVBX,0
MOVCX,15;外循环计数器
LOOP1:PUSHCX
MOVCX,20;内循环计数器
MOVDI,0
MOVAX,A[SI];取A数组中的一个数
L00P2:CMPB[DI],AX;和B数组中的数相等吗?
JNENO
MOVC[BX],AX;相等存入C数组中
ADDBX,2
NO:ADDDI,2
LOOPL00P2
ADDSI,2
POPCX
LOOPLOOP1
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.20设在A、B和C单元中分别存放着三个数。若三个数都不是0,则求
出三数之和存放在D单元中;若其中有一个数为0,则把其它两单元也清
0。请编写此程序。
答:程序如下:
DSEGSEGMENT
ADW?
BDW?
CDW?
DDW0
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:CMPA,0
JENEXT
CMPB,0
JENEXT
CMPC,0
JENEXT
MOVAX,A
ADDAX,B
ADDAX,C
MOVD,AX
JMPSHORTEXIT
NEXT:MOVA,0
MOVB,0
MOVC,0
EXIT:RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.21试编写一程序,要求比较数组ARRAY中的三个16位补码数,并依据
比较结果在终端上显示如下信息:
(1)假如三个数都不相等则显示0;
(2)假如三个数有二个数相等则显示1;
(3)假如三个数都相等则显示2。
答:程序如下:
DSEGSEGMENT
ARRAYDW3DUP(?)
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:LEASI,ARRAY
MOVDX,0;(DX)用于存放所求的结果
MOVAX,[SI]
MOVBX,[SI+2]
CMPAX,BX;比较第一和其次两个数是否相等
JNENEXT1
INCDX
NEXT1:CMP[SI+4],AX;比较第一和第三两个数是否相等
JNENEXT2
INCDX
NEXT2:CMP[SI+4],BX;比较其次和第三两个数是否相等
JNENUM
INCDX
NUM:CMPDX,3
JLDISP
DECDX
DISP:ADDDL,30H;转换为ASCH码
MOVAH,2;显示一个字符
INT21H
RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.22从键盘输入一系列字符(以回车符结束),并按字母、数字、与其它
字符分类计数,最终显示出这三类的计数结果。
答:程序如下:
DSEGSEGMENT
ALPHABETDB'输入的字母字符个数为:‘,'$'
NUMBERDB'输入的数字字符个数为:‘,'$'
OTHERDB'输入的其它字符个数为:','$'
CRLFDBODII,0AH,'$'
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVBX,0;字母字符计数器
MOVSI,0;数字字符计数器
MOVDI,0;其它字符计数器
INPUT:MOVAH,1;输入一个字符
INT21H
CMPAL,ODU;是回车符吗?
JEDISP
CMPAL,30H;〈数字0吗?
JAENEXT1
OTHER:INCDI;是其它字符
JMPSHORTINPUT
NEXT1:CMPAL,39H;>数字9吗?
JANEXT2
INCSI;是数字字符
JMPSHORTINPUT
NEXT2:CMPAL,41H;〈字母A吗?
JAENEXT3
JMPSHORTOTHER;是其它字符
NEXT3:CMPAL,5AH;>字母Z吗?
JANEXT4
INCBX;是字母字符A~Z
JMPSHORTINPUT
NEXT4:CMPAL,61H;〈字母a吗?
JAENEXT5
JMPSHORTOTHER;是其它字符
NEXT5:CMPAL,7AH;>字母z吗?
JASHORTOTHER;是其它字符
INCBX;是字母字符a~z
JMPSHORTINPUT
DISP:LEADX,ALPHABET
CALLDISPLAY
LEADX,NUMBER
MOVBX,SI
CALLDISPLAY
LEADX,OTHER
MOVBX,DI
CALLDISPLAY
RET
MAINENDP
DISPLAYPROCNEAR
MOVAH,09H;显示字符串功能调用
INT21H
CALLBINIHEX;调把BX中二进制数转换为16进制显示子程序
LEADX,CRLF
MOVAH,0911;显示回车换行
INT21H
RET
DISPLAYENDP
BINIHEXPROCNEAR;将BX中二进制数转换为16进制数显示子程序
MOVCH,4
ROTATE:MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,OFH
ADDDL,30H
CMPDL,3AH;是A~F吗?
JLPRINT_IT
ADDDL,07H
PRINT_IT:MOVAH,02H;显示一个字符
INT21H
DECCH
JNZROTATE
RET
BINIUEXENDP
CSEGENDS;以上定义代码段
ENDSTART
5.23已定义了两个整数变量A和B,试编写程序完成下列功能:
(1)若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中;
(2)若两个数中均为奇数,则将两数加1后存回原变量;
(3)若两个数中均为偶数,则两个变量均不变更。
答:程序如下:
DSEGSEGMENT
ADW?
BDW?
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVAX,A
MOVBX,B
XORAX,BX
TESTAX,OOO1H;A和B同为奇数或偶数吗?
JZCLASS;A和B都为奇数或偶数,转走
TESTBX,0001H
JZEXIT;B为偶数,转走
XCHGBX,A;A为偶数,将奇数存入A中
MOVB,BX;将偶数存入B中
JMPEXIT
CLASS:TESTBX,0001H;A和B都为奇数吗?
JZEXIT;A和B同为偶数,转走
INCB
INCA
EXIT:RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.24假设已编制好5个歌曲程序,它们的段地址和偏移地址存放在数据
段的跳动表SINGLIST中。试编制一程序,依据从键盘输入的歌曲编号C5,
转去执行五个歌曲程序中的某一个。
答:程序如下:
DSEGSEGMENT
SINGLISTDDSING1
DDSING2
DDSING3
DDSING4
DDSING5
ERRMSGDB'Error!Invalidparameter!J,ODII,OAH,'$
DSEGENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:CSEG,DS:DSEG
START:PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DSEG
MOVDS,AX;给DS赋值
BEGIN:MOVAH,1;从键盘输入的歌曲编号1~5
INT21H
CMPAL,ODH
JZEXIT;是回车符,则结束
SUBAL,T;是「5吗?
JBERROR;小于1,错误
CMPAL,4
JAERROR;大于5,错误
MOVBX,OFFSETSINGLIST
MULAX,4;(AX)=(AL)*4,每个歌曲程序的首地址占4个字节
ADDBX,AX
JMPDWORDPTR[BX];转去执行歌曲程序
ERROR:MOVDX,OFFSETERRMSG
MOVAH,09H
INT21H;显示错误信息
JMPBEGIN
SING1:■
JMPBEGIN
SING2:;
JMPBEGIN
SING3:I
JMPBEGIN
SING4:■
JMPBEGIN
SING5:!
JMPBEGIN
EXIT:RET
MAINENDP
CSEGENDS;以上定义代码段
ENDSTART
5.25试用8086的乘法指令编制一个32位数和16位数相乘的程序;再用
80386的乘法指令编制一个32位数和16位数相乘的程序,并定性比较两
个程序的效率。
答:8086的程序如下(假设为无符号数):
DSEGSEGMENT
MUL1DD?;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创新职业服务协议模板(2024年)
- DB11∕T 1705-2019 农业机械作业规范 青饲料收获机
- 2024年企业新员工劳动协议细则
- 2024电子商务平台服务居间协议
- 2024美发沙龙个人聘用协议样本
- 2024挖掘机购销协议范本
- 2024智能家居设备安装服务协议
- 2024年度纪录片后期制作服务协议
- 夫妻双方房产分割自愿离婚协议格式
- 2024物业管理室内装修协议
- ABS装置湿法挤出机系统存在的问题研究及对策的中期报告
- 《肉牛营养需要》教学课件
- 网易云音乐用户满意度调查问卷
- 雪佛兰爱唯欧说明书
- 经营分析报告案例-麦肯锡风格
- 烟花爆竹经营单位主要负责人安全培训
- 2023春国开会计实务专题形考任务1-4题库及答案汇总
- 可疑值的取舍-Q检验法
- 生物信息学(上海海洋大学)知到章节答案智慧树2023年
- 核磁共振T临床应用
- 文件与文件夹测试题(含参考答案)
评论
0/150
提交评论