编写程序讲解学习.docx
- 文档编号:6605611
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:37
- 大小:41.50KB
编写程序讲解学习.docx
《编写程序讲解学习.docx》由会员分享,可在线阅读,更多相关《编写程序讲解学习.docx(37页珍藏版)》请在冰豆网上搜索。
编写程序讲解学习
编写程序
3.22试编写一程序求出双字长数的绝对值。
双字长数在A和A+2单元中,结果存放在B和B+2单元中。
答:
程序段如下:
MOVAX,A
MOVDX,A+2
CMPDX,0
JNSZHENSHU;不是负数则转走
NEGDX
NEGAX
SBBDX,0
ZHENSHU:
MOVB,AX
MOVB+2,DX
INT20H
3.30编写程序段,把字符串STRING中的‘&’字符用空格符代替。
STRINGDB‘ThedateisFEB&03’
答:
程序段如下:
MOVCX,18
MOVAL,‘&’
CLD
MOVDI,SEGSTRING
MOVES,DI;ES段基地址
LEADI,STRING
REPNESCASB;不相等重复
JNENEXT;相等跳转
DECDI
MOVES:
BYTEPTR[DI],‘’;送空格符
NEXT:
┇
3.31假设数据段中数据定义如下:
STUDENT_NAMEDB30DUP(?
)
STUDENT_ADDRDB9DUP(?
)
PRINT_LINEDB132DUP(?
)
分别编写下列程序段:
(1)用空格符清除PRINT_LINE域。
(2)在STUDENT_ADDR中查找第一个‘-’。
(3)在STUDENT_ADDR中查找最后一个‘-’。
(4)如果STUDENT_NAME域中全是空格符时,填入‘*’。
(5)把STUDENT_NAME移到PRINT_LINE的前30个字节中,把STUDENT_ADDR移到PRINT_LINE的后9个字节中。
答:
公共的程序段如下:
MOVDI,DS
MOVES,DI
(1)MOVCX,132
MOVAL.,‘’;空格的ASCII码送AL寄存器
CLD
LEADI,PRINT_LINE
REPSTOSB
(2)MOVCX,9
MOVAL.,‘-’
CLD
LEADI,STUDENT_ADDR
REPNESCASB
JNENO_DASH
DECDI
NO_DASH:
┇
(3)MOVCX,9
MOVAL.,‘-’
STD
LEADI,STUDENT_ADDR
ADDDI,9-1
REPNESCASB
JNENO_DASH
INCDI
NO_DASH:
┇
(4)MOVCX,30
MOVAL,‘’;空格的ASCII码送AL寄存器
CLD
LEADI,STUDENT_NAME
REPESCASB
JNENEXT
MOVCX,30
MOVAL,‘*’;“*”的ASCII码送AL寄存器
LEADI,STUDENT_NAME
REPSTOSB
NEXT:
┇
(5)MOVCX,30
CLD
LEASI,STUDENT_NAME
LEADI,PRINT_LINE
REPMOVSB
MOVCX,9
STD
LEASI,STUDENT_ADDR+9-1
LEADI,PRINT_LINE+132-1
REPMOVSB
3.32编写一程序段:
比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于NEWS字符串则执行NEW_LESS;否则顺序执行程序。
答:
程序段如下:
MOVCX,5
CLD
MOVDI,SEGOLDS
MOVDS,DI
MOVES,DI
LEASI,OLDS
LEADI,NEWS
REPECMPSB
JNENEW_LESS
┇
NEW_LESS:
┇
3.47请编写一程序段,要求把ECX、EDX和ESI的内容相加,其和存入EDI寄存器中(不考虑溢出)。
答:
MOVEDI,0也可为:
MOVEDI,ECX
ADDEDI,ECXADDEDI,EDX
ADDEDI,EDXADDEDI,ESI
ADDEDI,ESI
3.49试编写一程序段,要求把BL中的数除以CL中的数,并把其商乘以2,最后的结果存入DX寄存器中。
答:
MOVAL,BL
MOVAH,0;假定为无符号数,否则用CBW指令即可
DIVCL
MOVAH,0
SHLAX,1;逻辑左移1位
MOVDX,AX
3.51试编写一程序段,要求在长度为100H字节的数组中,找出大于42H的无符号数的个数并存入字节单元UP中;找出小于42H的无符号数的个数并存入字节单元DOWN中。
答:
JMPBEGIN;无条件转移
UPDB0
DOWNDB0
TABLEDB100HDUP(?
);数组
BEGIN:
MOVCX,100H
MOVBX,-1;数组下标
MOVSI,0
MOVDI,0
L1:
INCBX
CMPTABLE[BX],42H
JAL2;高于
JBL3;低于
JMPL4;否则跳到L4
L2:
INCSI;UP
JMPL4
L3:
INCDI;DOWN
L4:
LOOPL1
MOVUP,SI
MOVDOWN,DI
4.11试写出一个完整的数据段DATA_SEG,它把整数5赋予一个字节,并把整数-1,0,2,5和4放在10字数组DATA_LIST的头5个单元中。
然后,写出完整的代码段,其功能为:
把DATA_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。
答:
DATA_SEGSEGMENT
NUMDB5
DATA_LISTDW-1,0,2,5,4,5DUP(?
)
MAXDW?
MINDW?
DATA_SEGENDS
;----------------------------------------------------------------
CODE_SEGSEGMENT
MAINPROCFAR
ASSUMECS:
CODE_SEG,DS:
DATA_SEG
START:
PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DATA_SEG;给DS赋值
MOVDS,AX
;
MOVCX,4;程序段开始
LEABX,DATA_LIST
MOVAX,[BX]
MOVMAX,AX
MOVMIN,AX
ROUT1:
ADDBX,2
MOVAX,[BX]
CMPAX,MAX
JNGEROUT2
MOVMAX,AX
ROUT2:
CMPAX,MIN
JNLEROUT3
MOVMIN,AX
ROUT3:
LOOPROUT1;程序段结束
RET
MAINENDP
CODE_SEGENDS
;----------------------------------------------------------------
ENDSTART
4.17写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG段中的SUM中。
其中AUGEND、ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为-15962。
答:
程序如下:
D_SEGSEGMENT
AUGWLABELWORD
AUGENDDD99251
SUMDD?
D_SEGENDS;以上定义数据段
;----------------------------------------------------------------
E_SEGSEGMENT
ADDWLABELWORD
ADDENDDD-15962
E_SEGENDS;以上定义附加段
;----------------------------------------------------------------
C_SEGSEGMENT
MAINPROCFAR
ASSUMECS:
C_SEG,DS:
D_SEG,ES:
E_SEG
START:
PUSHDS;设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,D_SEG
MOVDS,AX;给DS赋值
MOVAX,E_SEG
MOVES,AX;给ES赋值
;
MOVAX,AUGW;以下6条指令进行加法计算
MOVBX,AUGW+2
ADDAX,ES:
ADDW
ADCBX,ES:
ADDW+2;不考虑有符号数溢出
MOVWORDPTRSUM,AX
MOVWORDPTR[SUM+2],BX
RET
MAINENDP
C_SEGENDS;以上定义代码段
;----------------------------------------------------------------
ENDSTART
5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
答:
程序段如下:
BEGIN:
MOVAH,1;从键盘输入一个字符的DOS调用
INT21H
CMPAL,‘a’;输入字符<‘a’吗?
JBSTOP
CMPAL,‘z’;输入字符>‘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
┇
BEGIN:
MOVCL,4;右移四次
MOVCH,4;循环四次
LEABX,STORE
A10:
MOVDX,AX
ANDDX,0FH;取AX的低四位
MOV[BX],DL;低四位存入STORE中
INCBX
SHRAX,CL;右移四次
DECCH
JNZA10;循环四次完了码?
B10:
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.’
STRING2DB‘Iamastudent!
’
YESDB‘MATCH’,0DH,0AH,‘$’
NODB‘NOMATCH’,0DH,0AH,‘$’
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次(响铃的ASCII码为07)。
答:
程序段如下:
BEGIN:
MOVAH,1;从键盘输入一个字符的DOS调用
INT21H
SUBAL,‘0’
JBSTOP;输入字符<‘0’吗?
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(?
);存放正数
COUNT2DB0;存放负数的个数
ARRAY2DW20DUP(?
);存放负数
ZHENDB0DH,0AH,‘Thepositivenumberis:
’,‘$’;正数的个数是:
FUDB0DH,0AH,‘Thenegativenumberis:
’,‘$’;负数的个数是:
CRLFDB0DH,0AH,‘$’
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,‘0’;变为0~9的ASCII码
MOVDL,AH
MOVAH,2;显示一个字符的DOS调用
INT21H
ADDAL,‘0’;变为0~9的ASCII码
MOVDL,AL
MOVAH,2;显示一个字符的DOS调用
INT21H
LEADX,CRLF;显示回车换行
MOVAH,9;显示一个字符串的DOS调用
INT21H
RET
DISPLAYENDP;显示子程序结束
CSEGENDS;以上定义代码段
;--------------------------------------------------------------------------
ENDSTART
5.7试编写一个汇编语言程序,求出首地址为DATA(DATA数组)的100D字数组中的最小偶数,并把它存放在AX中。
答:
程序段如下:
BEGIN:
MOVBX,0
MOVCX,100
COMPARE:
MOVAX,DATA[BX];取数组的第一个偶数
ADDBX,2
TESTAX,01H;是偶数吗?
(偶数与01H逻辑与,不是0,不是偶数)
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的个数)在终端上显示出来。
(例如:
1010101010101010分为101010101010101010)
答:
程序段如下:
BEGIN:
MOVDL,0;计数初始值
MOVCX,8
COMPARE:
TESTAX,03H;是数03吗?
JNZNOEQUAL;不是,转走
INCDL;是,计数
NOEQUAL:
RORAX,1;准备判断下一个数
RORAX,1
LOOPCOMPARE
ADDDL,‘0’;将计数值转换为ASCII码
MOVAH,2;进行显示
INT21H
STOP:
RET
5.9试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数(1234H),并在终端上显示与它等值的二进制数。
答:
程序段如下:
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,0FH;转换为:
0000B~1001B
JMPBINARY
AF:
ANDAL,11011111B;转换为大写字母
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编写 程序 讲解 学习