第4章 汇编语言程序设计.docx
- 文档编号:4443904
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:40
- 大小:69.78KB
第4章 汇编语言程序设计.docx
《第4章 汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《第4章 汇编语言程序设计.docx(40页珍藏版)》请在冰豆网上搜索。
第4章汇编语言程序设计
习题4
1.什么是“三种基本结构”?
解释“基本”两个字在其中的含义。
答:
三种基本结构指:
顺序结构,选择结构、循环结构。
使用这3种结构,可以编制出任何所需要的程序,因此冠以“基本”结构。
2.什么叫做“控制转移指令”?
它和数据传送、运算指令有什么区别?
它是怎样实现它的功能的?
答:
控制转移指令是可以改变指令执行顺序的指令。
数据传送、运算指令总是顺序执行的,而控制转移指令通过改变IP和/或CS寄存器的值,改变了程序指令的执行顺序。
3.指令“JMPDI”和“JMPWORDPTR[DI]”作用有什么不同?
请说明。
答:
上述两条指令都是段内近转移指令,但是偏移地址的来源不同。
指令“JMPDI”执行时,新的偏移地址在DI寄存器内,“JMPWORDPTR[DI]”时,目的偏移地址在存储单元中,该存储单元的地址在DS:
DI中。
4.已知(AX)=836BH,X分别取下列值,执行“CMPAX,X”后,标志位ZF、CF、OF、SF各是什么?
(1)X=3000H
(2)X=8000H(3)X=7FFFFH(4)X=0FFFFH(5)X=0
答:
上述指令执行后,标志位ZF、CF、OF、SF的状态分别是:
(1)ZCOS=0010
(2)ZCOS=0000(3)ZCOS=0010(4)ZCOS=0101
(5)ZCOS=0001
5.已知(AX)=836BH,X分别取下列值,执行“TESTAX,X”后,标志位ZF、CF、OF、SF各是什么?
(1)X=0001H
(2)X=8000H(3)X=0007H(4)X=0FFFFH(5)X=0
答:
上述指令执行后,标志位ZF、CF、OF、SF的状态分别是:
(1)ZCOS=0000
(2)ZCOS=0001(3)ZCOS=0000(4)ZCOS=0001
(5)ZCOS=1000
6.测试名为X的一个字节,如果X的第1,3位均为1,转移到L1,如果只有一位为1,转移到L2,如果两位全为0,转移到L3。
写出对应的指令序列。
答:
MOVAL,X
ANDAL,00001010B
JZL3
CMPAL,00001010B
JEL1
JMPL2
7.假设X和X+2字单元存放有双精度数P,Y和Y+2字单元存放有双精度数Q,下面程序完成了什么工作?
MOVDX,X+2
MOVAX,X;双精度数P送入DX,AX
ADDAX,X
ADCDX,X+2;计算2*P送入DX,AX
CMPDX,Y+2;2P与Q的高位比较
JLL2;2P JGL1;2P>Q,转L1(Z=1) CMPAX,Y;如果高位相等,则比较低位 JBEL2;2P的低位小于等于Q的低位,转L2(Z=2) L1: MOVZ,1 JMPSHORTEXIT L2: MOVZ,2 EXIT: …… 答: 程序根据2P与Q的大小,确定Z的值。 如果2P≤Q,则Z=2 如果2P>Q,则Z=1 请参阅程序注解 8.编写指令序列,将AX和BX中较大的绝对值存入AX,较小的绝对值存入BX。 答: ANDAX,AX JGESKIP1 NEGAX SKIP1: ANDBX,BX JGESKIP2 NEGBX SKIP2: CMPAX,BX JGESKIP3 XCHGAX,BX SKIP3: …… 9.编写指令序列,比较AX、BX中的数的绝对值,绝对值较大的数存入AX,绝对值较小的数存入BX。 答: PUSHAX PUSHBX ANDAX,AX JGESKIP1 NEGAX SKIP1: ANDBX,BX JGESKIP2 NEGBX SKIP2: CMPAX,BX POPBX POPAX JGESKIP3 XCHGAX,BX SKIP3: …… 10.编写指令序列,如果AL寄存器存放的是小写字母,把它转换成大写字母,否则不改变AL内容。 答: CMPAL,‘a’ JBDONE CMPAL,‘z’ JADONE SUBAL,‘a’-‘A’ DONE: …… 11.计算分段函数: X的值从键盘输入,Y的值送显示器输出。 答: INCLUDEYLIB.H DATASEGEMNT MESS1DB0DH,0AH,‘InputvalueofXplease: $’ MESS2DB0DH,0AH,‘Y=: $’ DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX LEADX,MESS1 CALLREADINT;输入X的值 CMPAX,-2 JGEL2 L1: SUBAX,3;AX←X-3 JMPDONE L2: CMPAX,3 JGL3 MOVBX,AX ADDAX,AX;AX←2X ADDAX,AX;AX←4X ADDAX,BX;AX←5X ADDAX,6;AX←5X+6 JMPDONE L3: MOVAX,2;AX←2 DONE: LEADX,MESS2 CALLWRITEINT;输出Y的值 CALLCRLF MOVAX,4C00H INT21H CODEENDS ENDSTART 12.计算分段函数: A,B的值从键盘输入,Y的值送显示器输出(∧表示“并且”,∨表示“或者”)。 答: INCLUDEYLIB.H DATASEGEMNT MESS1DB0DH,0AH,‘InputthevalueofAplease: $’ MESS2DB0DH,0AH,‘InputthevalueofBplease: $’ MESS3DB0DH,0AH,‘Y=: $’ ADW? BDW? DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX LEADX,MESS1 CALLREADINT;输入A MOVA,AX LEADX,MESS2 CALLREADINT;输入B MOVB,AX ANDAX,AX JLL1;B<0,转L1 CMPA,0 JLL1;A<0,转L1 JNZSKIP1 CMPB,0 JZL2;A=0&&B=0,转L2 JMPEXIT;A=0&&B≠0,无定义,转EXIT SKIP1: CMPB,0 JLEEXIT;A≠0&&B=0,无定义,转EXIT L3: MOVAX,A SUBAX,B JMPDISP L2: MOVAX,2 JMPDISP L1: MOVAX,A ADDAX,B DISP: LEADX,MESS2 CALLWRITEINT;输出Y的值 CALLCRLF EXIT: MOVAX,4C00H INT21H CODEENDS ENDSTART 说明: 如果把A、B看作是平面直角坐标的两根轴,那么这个函数在A,B的正轴上无定义。 无法计算,也无法输出结果。 13.编写程序,求10元素字数组LIST中绝对值最小的数,存入MIN单元。 答: DATASEGEMNT LISTDW-56,+12,88,-126,-5,16,32,-99,72,-18 MINDW? MINABSDW? DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX MOVAX,LIST MOVMIN,AX;将数组第一个元素假设为绝对值最小的数 MOVMINABS,32767;最小的绝对值假设为32767 LEASI,LIST MOVCX,10 AGAIN: MOVAX,[SI] CMPAX,0 JGESKIP1 NEGAX;求绝对值 SKIP1: CMPAX,MINABS;绝对值与假设的最小绝对值比较 JGESKIP2;假设的绝对值较小,跳过 MOVMINABS,AX;保存新的最小绝对值 MOVAX,[SI];取出新的绝对值最小的数 MOVMIN,AX;保留新的绝对值最小的数 SKIP2: ADDSI,2 LOOPAGAIN MOVAX,4C00H INT21H CODEENDS ENDSTART 说明: 一定要预设最小的绝对值和绝对值最小的数,而且这个绝对值最小的数必须来自LIST数组。 14.编写程序,求20元素无符号字数组ARRAY中最小的奇数,存入ODD单元,如果不存在奇数,将ODD单元清零。 答: DATASEGEMNT ARRAYDW56,12,88,126,5,16,32,99,72,18 DW116,34,92,32,156,42,816,16,15,218 ODDDW? DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX MOVBX,0 MOVODD,65535;将65535假设为最小的奇数 LEASI,ARRAY MOVCX,20 AGAIN: MOVAX,[SI] TESTAX,1;测试是否为奇数 JZSKIP;不是奇数跳过 INCBX;记录奇数个数 CMPAX,ODD;奇数与预设的最小奇数比较 JGESKIP;大于预设奇数,跳过 MOVODD,AX;小于预设奇数,保留 SKIP: ADDSI,2 LOOPAGAIN CMPBX,0;判有无出现过奇数 JNZDONE MOVODD,0;未出现过,把ODD单元清零 DONE: MOVAX,4C00H INT21H CODEENDS ENDSTART 15.一个有符号字数组以0为结束标志,求这个数组的: 最大值、最小值、平均值。 答: DATASEGEMNT LISTDW-56,+12,88,-126,-5,16,32,-99,72,-18,0 MINDW? MAXDW? AVGDW? DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX MOVMIN,32767;将32767假设为最小的数 MOVMAX,-32768;将-32768假设为最大的数 MOVAVG,0;AVG用作累加器,清零 LEASI,LIST MOVCX,0 AGAIN: MOVAX,[SI] CMPAX,0 JZDONE;找到零元素,转DONE结束处理 INCCX;纪录非零元素个数 ADDAVG,AX;累加 CMPAX,MIN JGESKIP1 MOVMIN.AX;比预设最小值还小,保留 SKIP1: CMPAX,MAX JLESKIP2 MOVMAX,AX;比预设最大值还大,保留 SKIP2: ADDSI,2 JMPAGAIN DONE: JCXZNULL;元素个数为零,转NULL处理 MOVAX,AVG CWD IDIVCX MOVAVG,AX;计算平均值 JMPEXIT NULL: MOVMIN,0;元素个数为0,将“最大值”、“最小值” MOVMAX,0;“平均值”清零 MOVAVG,0 EXIT: MOVAX,4C00H INT21H CODEENDS ENDSTART 16.数组SCORE中存有一个班级40名学生的英语课程成绩。 按照0~59,60~74,75~84,85~100统计各分数段人数,存入N0,N1,N2,N3变量内。 答: DATASEGEMNT SCOREDW40DUP(? );运行前置入具体数据 N0DW? N1DW? N2DW? N3DW? DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX MOVN0,0;各计数器清零 MOVN1,0 MOVN2,0 MOVN3,0 LEASI,SCORE MOVCX,40 AGAIN: MOVAX,[SI] CMPAX,59;分段测试 JAL1 L0: INCN0 JMPNEXT L1: CMPAX,74 JAL2 INCN1 JMPNEXT L2: CMPAX,84 JAL3 INCN2 JMPNEXT L3: CMPAX,100 JANEXT INCN3 NEXT: ADDSI,2 LOOPAGAIN EXIT: MOVAX,4C00H INT21H CODEENDS ENDSTART 17.STRING是一个16个字符组成的字符串,RULE是一个字整数。 编写程序,测试STRING中的每一个字符,如果该字符为数字字符,把RULE中对应位置1,否则置0。 答: DATASEGEMNT STRINGDB16DUP(? );运行前置入具体字符 RULEDW? DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX MOVRULE,0;RULE置为初始状态 LEASI,STRING MOVCX,16 AGAIN: SHLRULE,1;右侧空出一位 MOVAL,[SI] CMPAL,‘0’;测试是否数字 JBNEXT CMPAL,‘9’ JANEXT ORRULE,1;将RULE对应位置1 NEXT: INCSI LOOPAGAIN EXIT: MOVAX,4C00H INT21H CODEENDS ENDSTART 18.编写程序,从键盘上输入一个无符号字整数,用“四进制”格式输出它的值(也就是,每2位二进制看作一位四进制数,使用数字0~3)。 答: INCLUDEYLIB.H DATASEGEMNT MESS1DB0DH,0AH,‘Inputanumberplease: $’ MESS2DB0DH,0AH,‘Thenumberinquardri_systemis: $’ DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX LEADX,MESS1 CALLREADDEC;输入一个无符号整数 MOVBX,AX;转存到BX LEADX,MESS2 MOVAH,9 INT21H;输出前导信息 MOVCX,8 ONE: ROLBX,1 ROLBX,1;最高2位移到最低位 MOVDL,BL;转存到DL ANDDL,00000011B;保留最低2位 ORDL,30H;转换成ASCII代码 MOVAH,2 INT21H;输出 LOOPONE CALLCRLF MOVAX,4C00H INT21H CODEENDS ENDSTART 19.编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送入数组P和M,正数和零元素送P数组,负数送M数组。 答: DATASEGEMNT ARRAYDW30DUP(? );汇编之前置入数据 PDW30DUP(? ) MDW30DUP(? ) DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX LEABX,ARRAY;ARRAY数组指针 MOVSI,0;P数组指针 MOVDI,0;M数组指针 MOVCX,30 ONE: MOVAX,[BX];从ARRAY数组取出一个数据 ANDAX,AL JGEPLUS;正数、零转PLUS MINUS: MOVM[DI],AX;负数存入M数组 ADDDI,2 JMPNEXT PLUS: MOVP[SI],AX;正数、零存入P数组 ADDSI,2 NEXT: ADDBX,2 LOOPONE MOVAX,4C00H INT21H CODEENDS ENDSTART 20.缓冲区BUFFER中存放有字符串,以0为结束标志。 编写程序,把字符串中的大写字母转换成小写字母。 答: DATASEGEMNT BUFFERDB‘AStringforTest.’,0 DATAENDS CODESEGMENT ASSUMECS: CODE,DS: DATA START: MOVAX,DATA MOVDS,AX LEABX,BUFFER;BUFFER缓冲区指针 ONE: MOVAL,[BX];从缓冲区取出一个字符 ANDAL,AL JZQUIT;为零,处理完成 CMPAL,‘A’ JBNEXT CMPAL,‘Z’ JANEXT ADDAL,‘a’-‘A’ MOV[BX],AL NEXT: INCBX JMPONE QUIT: MOVAX,4C00H INT21H CODEENDS ENDSTART 21.编写程序,从键盘上输入无符号字整数X,Y的值,进行X+Y的运算,然后按以下格式显示运算结果和运算后对应标志位的状态。 SUM=XXXX ZF=Y,OF=Y,SF=Y,CF=Y (其中X为十进制数字,Y为0或1) 答: INCLUDEYLIB.H CODESEGMENT ASSUMECS: CODE MESS1DB0DH,0AH,‘Inputaunsignedintegerplease: $’ MESS2DB0DH,0AH,‘SUM=$’ MESS3DB0DH,0AH,‘ZF=’ ZFDB? DB‘,OF=’ OFDB? DB‘,SF=’ SFDB? DB‘,CF=’ CFDB? DB0DH,0AH,‘$’ START: PUSHCS POPDS LEADX,MESS1 CALLREADDEC MOVCX,AX;输入X LEADX,MESS1 CALLREADDEC;输入Y ADDAX,CX;求和 PUSHF;保留标志位状态 LEADX,MESS2 CALLWRITEDEC;输出两个数的和 POPBX;标志寄存器内容转存入BX MOVAL,‘0’ TESTBX,1000000B;测试ZF JZSKP1 INCAL SKIP1: MOVZF,AL MOVAL,‘0’ TESTBX,100000000000B;测试OF JZSKP2 INCAL SKIP2: MOVOF,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 汇编语言程序设计 汇编语言 程序设计