版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章
1.分别说明下列指令的源操作数和目的操作数各采用什么寻址方式。
(1)MOVAX,2408H(2)MOVCL,OFFH(3)MOVBX,[SI]
(4)MOV5[BX],BL(5)MOV[BP+1OOH],AX(6)MOV[BX+DI],'$'
(7)MOVDX,ES:[BX+SI1(8)MOVVAL[BP+DI],DX
(9)INAL,05H(10)MOVDS,AX
答:(1)立即数,寄存器(2)立即数,寄存器(3)寄存器间接,寄存器
(4)寄存器,寄存器相对(5)寄存器,寄存器相对(6)立即数,基址变址
(7)基址变址,寄存器(8)寄存器,相对基址变址
(9)直接端口寻址,寄存器(10)寄存器,寄存器
2.已知:DS=1000H,BX=0200H,SI=02H,内存10200H〜10205H单元的内容分别为10H,
2AH,3CH,46H,59H,6BH。下列每条指令执行完后AX寄存器的内容各是什么?
(1)MOVAX,0200H(2)MOVAX,[200H](3)MOVAX,BX
(4)MOVAX,3[BX](5)MOVAX,[BX+S1](6)MOVAX,2[BX+SI]
答:(1)0200H(2)2A10H(3)0200H
(4)5946H(5)463CH(6)6B59H
3.设DS=1000H,ES=2000H,SS=35OOH,SI=00A0H,DI=0024H,BX=0100H,BP=0200H,
数据段中变量名为VAL的偏移地址值为0030H,试说明下列源操作数字段的寻址方式是什
么?物理地址值是多少?
(1)MOVAX,[100H](2)MOVAX,VAL(3)MOVAX,[BX]
(4)MOVAX,ES:[BX](5)MOVAX,[SI](6)MOVAX,[BX+10H]
(7)MOVAX,[BP](8)MOVAX,VAL[BP][SI]
(9)MOVAX,VAL[BX][DI](10)MOVAX,[BP][DI]
答:(1)直接,10100H(2)直接,10030H(3)寄存器间接,10100H
(4)寄存器间接,20100H(5)寄存器间接/00A0H(6)寄存器相对,10110H
(7)寄存器间接,35200H(8)相对基址变址,352D0H
(9)相对基址变址,10154H(10)基址变址,35224H
4.写出下列指令的机器码
(1)MOVAL,CL(2)MOVDX,CX(3)MOV[BX+100H],3150H
答:(1)1000101011000001B
(2)1000101111010001B
(3)HOOOlil1000011100000000000000010101000000110001B
5.已知程序的数据段为:
DATASEGMENT
ADB$,10H
BDB'COMPUTER5
CDW1234H,OFFH
DDB5DUP(?)
EDD1200459AH
DATAENDS
求下列程序段执行后的结果是什么。
MOVAL,A
MOVDX,C
XCHGDL,A
MOVBX,OFFSETB
MOVCX,3[BX]
LEABX,D
LDSSI,E
LESDI,E
答:MOVAL,AAL=24H
MOVDX,CDX=1234H
XCHGDL,ADL=24H,A=34H
MOVBX,OFFSETBBX=2
MOVCX,3[BX]CX=5550H
LEABX,DBX=000EH
LDSSI,EDS=1200H,SIM59AH
LESDI,EES=1200H,DI=459AH
6.指出下列指令中哪些是错误的,错在什么地方。
(1)MOVDL,AX(2)MOV8650H,AX(3)MOV
DS,0200H
(4)MOV[BX],[1200H](5)MOVIP,OFFH(6)
MOV[BX+SI+3],IP
(7)MOVAX,[BX][BP](8)MOVAL,ES:[BP](9)
MOVDL,[SI][DI]
(10)MOVAX,OFFSET0A20H(11)MOVAL,
OFFSETTABLE
(12)XCHGAL,50H(13)INBL,05H(14)OUT
AL,OFFEH
答:(1)长度不匹配(2)立即数不能做目的操作数
(3)段寄存器不能用立即数赋值(4)两个内存单元
不能直接传送数据
(5)IP不能用指令直接修改(6)指令中不能出现IP
(7)BX/BP应与SI/DI搭配(8)正确
(9)SI/DI应与BX/BP搭配(10)OFFSET后应跟
内存单元
(11)偏移地址为16位,AL长度不够(12)立即数
不能用于XCHG
(13)IN必须用AL/AX(14)操作数顺序反向;地
址应为8位
7.已知当前数据段中有一个十进制数字0〜9的7段
代码表,其数值依次为40H,79H,24H,
30H,19H,12H,02H,78H,OOH,18H。要求用XLAT
指令将十进制数57转换成相应的
7段代码值,存到BX寄存器中,试写出相应的程序
段。
答:DATASEGMENT
TABLEDB40H,79H,24H,30H,19H,12H,02H,
78H,OOH,18H
DATAENDS
MOVAL,5
MOVBX,OFFSETTABLE
XLATTABLE
MOVCL,AL
MOVAL,7
XLATTABLE
MOVBL,AL
MOVBH,CL
8.已知当前SS=1O5OH,SP=0100H,AXM860H,
BX=1287H,试用示意图表示执行下列指
令过程中,堆栈中的内容和堆栈指针SP是怎样变化
的。
PUSHAX
PUSHBX
POPBX
POPAX
(1>指令执行前<2>执行PUSHAX后
(1)指
9.下列指令完成什么功能?
(1)ADDAL,DH(2)ADCBX,CX(3)SUBAX,
271OH
(4)DECBX(5)NEGCX(6)INCBL
(7)MULBX(8)DIVCL
答:(1)AL+DH-AL(2)BX+CX+CF-BX(3)
AX-2710H—AX
(4)BX-1-BX⑸0-CXfCX(6)BL+1
-BL
(7)AX*BX-DX,AX(8)AX/CL商fAL,余数
一AH
10.已知AX=2508H,BX=OF36H,CX=0004H,
DX=1864H,求下列每条指令执行后的结果
是什么?标志位CF等于什么?
(1)ANDAH,CL(2)ORBL,30H(3)NOTAX
(4)XORCX,OFFFOH(5)TESTDH,OFH(6)
CMPCX,OOH
(7)SHRDX,CL(8)SARAL,1(9)SHLBH,
CL
(10)SALAX,1(11)RCLBX,1(12)RORDX,
CL
答:(1)AX=0408H,CF=O(2)BX=0F36H,CF=O
(3)AX=0DAF7H,CF不变(4)CX=0FFF4H,CF=O
(5)DXR1864H,CF=O(6)CX=0004H,CF=O
(7)DX=0186H,CF=O(8)AX=2504H,CF=O
(9)BX=0F036H,CF=O(10)AXMA10H,CF=O
(11)BX=1E6C/1E6DH,CF=O(12)DX=4186H,
CF=O
11.假设数据段定义如下:
DATASEGMENT
STRINGDB'ThePersonalComputer&TV'
DATAENDS
试用字符串操作等指令编程完成以下功能:
(1)把该字符串传送到附加段中偏移量为GET.CHAR
开始的内存单元中。
(2)比较该字符串是否与‘TheComputer,相同,若相同
则将AL寄存器的内容置1,否则置
0o并要求将比较次数送到BL寄存器中。
(3)检查该字符串是否有,&,,若有则用空格字符将其
替换。
(4)把字符串大写字母传送到附加段中以CAPS开始
的单元中,其余字符传到以CHART
开始的单元中。然后将数据段中存储上述字符串的单元
清0。
答:⑴CLD
LEASI,STRING
LEADI,GET_CHAR
MOVCX,26
REPMOVSB
(2)补充在附加段定义
STRING1DB'Thecomputer,
MOVAL,1
CLD
LEASI,STRING
LEADI,STRING1
MOVCX,12
REPZCMPSB
JZSKIP
MOVAL,0
SKIP:MOVBX,12
SUBBX,CX
(3)MOVAX,DATA
MOVES,AX
CLD
MOVAL;&'
LEADI,STRING
MOVCX,26
NEXT:REPNESCASB
JZFIND
JMPEXIT
FIND:MOVBYTEPTR[DI-1],"
JCXZEXIT
JMPNEXT
EXIT:
(4)LEASI,STRING
LEADI,CAPS
LEABX,CHART
MOVCX,26
NEXT:MOVAL,[SI]
CMPAL,'A'
JBOTHER
CMPAL,'Z'
JAOTHER
MOVES:[DI],AL
INCDI
JMPSKIP
OTHER:MOVES:[BX],AL
INCBX
SKIP:MOVBYTEPTR[SI],0
INCSI
LOOPNEXT
12.编程将AX寄存器中的内容以相反的顺序传送到DX寄存器中,并要求AX中的内容不
被破坏,然后统计DX寄存器中’1'的个数是多少。
答::MOVBL,0
PUSHAX
MOVDX,0
MOVCX,16
NEXT:SHLAX,1
JNCSKIP
INCBL
SKIP:RCRDXJ
LOOPNEXT
STOP:POPAX
13.设CS=1200H,IP=0100H,SS=5000H,SP=0400H,DS=2000H,SI=3000H,BX=0300H,
(20300H)=4800H,(20302H)=00FFH,TABLE=0500H,PROG_N标号的地址为1200:
0278H,PROG_F标号的地址为3400H:OABCH。说明下列每条指令执行完后,程序将分别
转移到何处执行?
(1)JMPPROG_N
(2)JMPBX
(3)JMP[BX]
(4)JMPFARPROG_F
(5)JMPDWORDPTR[BX]
如将上述指令中的操作码JMP改成CALL,则每条指令执行完后,程序转向何处执行?并
请画图说明堆栈中的内容和堆栈指针如何变化。
答:(1)1200H:0278H
(2)1200H:0300H
(3)1200H:4800H
(4)3400H:OABCH
(5)OOFFH:4800H
将操作码JMP改成CALL后:
(1)1200H:0278H
指令长度为3,则IP=O1OOH+3=O1O3H,入栈
Cl>12OOHsO278H
指令长度为2,则IP=0100H+2=0102H,入栈
5O00H:OOOOH
02H
O1H
5000H:03FEHOOH
12H
SOOOHiO4O0H
14.在下列程序段括号中分别填入以下指令
(1)LOOPNEXT(2)LOOPENEXT(3)LOOPNENEXT
试说明在这三种情况下,程序段执行完后,AX,BX,CX,DX的内容分别是什么。
START:MOVAX,01H
MOVBX,02H
MOVDX,03H
MOVCX,04H
NEXT:INCAX
ADDBX,AX
SHRDX,1
()
答:(1)AX=05HBX=1OHCX=0DX=0
(2)AX=02HBX=04HCX=03HDX=01H
(3)AX=03HBX=07HCX=02HDX=0
15.某班有7个同学英语成绩低于80分,分数存在ARRAY数组中,试编程完成以下工作:
(1)给每人加5分,结果存到NEW数组中
(2)把总分存到SUM单元中
答:DATASEGMENT
ARRAYDB?,?,?,?,?,?,?
NEWDB7DUP(?)
SUMDW0
DATAENDS
MOVAX,DATA
MOVDS,AX
(1)LEASLARRAY
LEADI,NEW
MOVCX,7
NEXT:MOVAL,[SI]
ADDAL,5
MOV|DI],AL
INCSI
INCDI
LOOPNEXT
(2)LEASI,ARRAY
CLC
□SP
5000H:0000H
5000H:03FCH
5000H:03FEH
5000H:0400H
MOVCX,7
NEXT!:MOVAL,[SI]
MOVAH,0
ADCSUM,AX
INCSI
LOOPNEXT1
16.中断向量表的作用是什么?它放在内存的什么区域内?中断向量表中的什么地址用于
类型3的中断?
答:中断向量表用来存放中断服务程序的4口地址。8086的256类中断的入口地址要占用
1K字节,位于内存00000H〜003FFH的区域内。中断向量表中0000CH〜0000FH用于类型
3的中断。
17.设类型2的中断服务程序的起始地址为0485:0016H,它在中断向量表中如何存放?
答:物理地址内容
00008H16H
00009H00H
0000AH85H
0000BH04H
18.若中断向量表中地址为0040H中存放240BH,0042H单元里存放的是D169H,试问:
(1)这些单元对应的中断类型是什么?
(2)该中断服务程序的起始地址是什么?
答:⑴10H
(2)D169H:240BH
19.简要说明8086响应类型0〜4中断的条件是什么?
答:类型0:除法错中断
执行除法指令时,若除数为。或所得商超过寄存器能容纳的范围,则自动产生类型0
中断。
类型1:单步中断
若CPU的单步标志TF=1,则每执行完--条指令后,自动产生类型1中断。
类型2:不可屏蔽中断NMI
当8086的NMI引脚上接收到由低变高的电平变化时,将自动产生类型2中断。
类型3:断点中断
若在程序中某位置设置断点,当程序执行到该断点时,则产生类型3中断。
类型4:溢出中断
若溢出标志OF=L则可由溢出中断指令INTO产生类型4中断。
第四章
1.下列变量各占多少字节?
AlDW23H,5876H
A2DB3DUP(?),OAH,0DH,$
A3DD5DUP(1234H,567890H)
A4DB4DUP(3DUP(1,2,'ABC'))
答:Al占4个字节
A2占6个字节
A3占40个字节
A4占60个字节
2.下列指令完成什么功能?
MOVAX,OOFFHAND1122H+3344H
MOVAL,15GEHUB
MOVAX,OOFFHLE255+6/5
ANDAL,50MOD4
ORAX,OFOOFHAND1234OROOFFH
答:(1)将0066H传送给AX
(2)将OFFH传送给AL
(3)将OFFFFH传送给AX
(4)ANDAL,02H
(5)ORAX,OOFFH
3.有符号定义语句如下:
BUFDB3,4,5,“23'
ABUFDB0
LEQUABUF-BUF
求L的值为多少?
答:L=6
4.假设程序中的数据定义如下:
PARDW?
PNAMEDB16DUP(?)
COUNTDD?
PLENTHEQU$-PAR
求PLENTH的值为多少?表示什么意义?
答:PAR的偏移地址为0,PLENTH当前偏移地址$=2+16+4=22,$-PAR=22,故PLENTH
的值为22o
若在PLENTH所在行有变量定义,则$表示该变量的偏移地址,即$表示PLENTH所在
行的当前偏移地址。故PLENTH表示从当前行到PAR之间定义的变量所占的字节个数。
5.对于下面的数据定义,各条MOV指令执行后,有关寄存器的内容是什么?
DAIDB?
DA2DW10DUP(?)
DA3DB'ABCD'
MOVAX,TYPEDAI
MOVBX,SIZEDA2
MOVCX,LENGTHDA3
答:AX=l,BX=20,CX=l
6.下段程序完成后,AH等于什么?
INAL,5FH
TESTAL,80H
JZL1
MOVAH,0
JMPSTOP
LI:MOVAH,OFFH
STOP:HLT
答:讨论从端口5FH输入的数据最高位的情况。若最高位为1,则AH=0;若最高位为0,
则AH=0FFHo
7.编程序完成下列功能:
(1)利用中断调用产生5秒延时。
(2)利用中断调用,在屏幕上显示1〜9之间随机数。
答:(1)可以利用中断类型1CH来处理,因为在系统时钟的中断处理程序中,时钟中断•
次要调用一次INT1CH,即每隔55ms,产生一次1CH中断,要产生5秒延时,只要中断
5s/55ms=91次即可。又因1CH中断处理程序中只有一条IRET指令,故可将用户的程序代
替原有的INT1CH程序。
DATASEGMENT
COUNTDW91;计数器
MESSDB'5sdelayed!,,0AH,0DH,,S,
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:CODE,DS:DATA,ES:DATA
START:PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVAL,1CH;得到原中断向量
MOVAH,35H
INT21H
PUSHES;存储原中断向量
PUSHBX
PUSHDS
MOVDX,OFFSETDELAY;DELAY的偏移地址和段地址
MOVAX,SEGDELAY
MOVDS,AX
MOVAL,1CH;设置中断向量
MOVAH,25H
INT21H
POPDS
INAL,21H:设置中断屏蔽位
ANDAL,0FEH
OUT21H,AL
STI
MOVDL2000H;主程序延迟,在执行此段程序期间
Al:MOVSI,3000H;产生中断
A2:DECSI
JNZA2
DECDI
JNZAl
POPDX;取原中断向量
POPDS
MOVAL,1CH
MOVAH,25H
INT21H
RET
MAINENDP
DELAYPROCNEAR
PUSHDS
PUSHAX
PUSHCX
PUSHDX
MOVAX,DATA
MOVDS,AX
STI
DECCOUNT;5秒计数
JNZEXIT
MOVDX,OFFSETMESS;显示信息
MOVAH,09H
INT21H
MOVCOUNT,%;5秒的值
EXIT:CLI
POPDX
POPCX
POPAX
POPDS
IRET
DELAYENDP
CODEENDS
ENDSTART
(2)可以利用INT1AH,读取当前时间的1/100秒为随机数。
CODESEGMENT
ASSUMECS:CODE
START:MOVAH,0
INT1AH;读取当前时间CH:CL=时:分
MOVAL,DL;DH:DL=^:1/100秒
MOVAH,0
MOVBL,9
DIVBL
INCAH
MOVDL,AH
ADDDL,30H
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
8.编两个通过过程完成将AX中存放的二进制数转换成压缩型BCD码以及将BCD码转换
成二进制数。
答:(1)将AX中的二进制数先后除以1000,100和10,每次除法所得的商,即是BCD数
的千位、百位和十位数,余数是个位数。
子程序名:B2TOBCD
输入参数:AX=十六位二进制数
输出参数:CF=0,则AX=4位压缩型BCD码。CF=1,则要转换的数大于9999,AX不
变。
使用寄存器:CX:存放除数,DX:存放中间结果。
B2TOBCDPROCFAR
CMPAX,9999;AX>9999,则CF置1
JBETRAN
STC
JMPEXIT
TRAN:PUSHCX
PUSHDX
SUBDX,DX;DX清0
MOVCXJOOO;计算千位数
DIVCX
XCHGAX,DX;商在DX中,余数在AX中
MOVCL,4
SHLDX,CL;DX左移4位
MOVCL,100;计算百位数
DIVCL
ADDDL,AL;百位数加到DL中,DX左移4位
MOVCL,4
SHLDX,CL
XCHGAL,AH;余数保留在AL中
SUBAH,AH
MOVCL,10;计算十位数
DIVCL
ADDDL,AL;十位数加到DL中,DX左移4位
MOVCL,4
SHLDX,CL
ADDDL,AH;加个位数
MOVAX,DX;结果送到AX中
POPDX
POPCX
EXIT:RET
B2TOBCDENDP
(2)将AX中4位BCD码顺序乘以1000,100,10和1,然后求和即得。
子程序名:BCDTOB2
输入参数:AX=4位压缩BCD码
输出参数:AX二十六位二进制数
使用寄存器:BX:暂存数据,CX:存放乘数,DX:存放中间结果
BCDTOB2PROCFAR
PUSHBX
PUSHCX
PUSHDX
MOVBX,AX
MOVCL,4
ROLAX,CL
ANDAX,000FH
MOVCX,1000;乘以1000
MULCX
MOVDX,AX
MOVAX,BX
MOVCL,8
ROLAX,CL
ANDAX,000FH
MOVCL,100;乘以100
MULCL
ADDDX,AX
MOVAX,BX
MOVCL,4
SHRAX,CL
ANDAX,000FH
MOVCL,10;乘以10
MULCL
ADDDX,AX
ANDBX,000FH
ADDDX,BX
MOVAX,DX
POPDX
POPCX
POPBX
RET
BCDTOB2ENDP
9.编写两个通用过程,一个完成ASCH码转换成二进制数功能,另个完成ASCII字符显
示输出功能。
答:(1)将AX中两位ASCII码先转化成数字,然后AH*10+AL。
子程序名:ASCIIT0B2
输入参数:AX=2位ASCII码
输出参数:AX二转换后二进制数
使用寄存器:BX,CX,DX
ASCIIT0B2PROCFAR
PUSHBX
PUSHCX
PUSHDX
MOVBX,AX
SUBAH,30H
MOVAL,AH
MOVCL,10;乘以10
MULCL
MOVDX,AX
MOVAX,BX
SUBAL,30H
MOVAH,0
ADDAX,DX
POPDX
POPCX
POPBX
RET
ASCIITOB2ENDP
(2)使用2号DOS功能调用显示字符。
子程序名:DISPLAY
输入参数:AX=2位ASCII码
输出参数:无
使用寄存器:BX,DX
DISPLAYPROCFAR
PUSHBX
PUSHDX
MOVBX,AX
MOVDL,AH
MOVAH,2
INT21H
MOVAX,BX
MOVDL,AL
MOVAH,2
INT21H
POPDX
POPBX
RET
DISPLAYENDP
10.编制两个通用过程,完成十六进制数转换成ASCII码并将ASCII码字符显示。
答:(1)子程序名:HEXTOASC
输入参数:AX:4位十六进制数
输出参数:DX,AX:4位ASCII码,DX高2位,AX低2位
使用寄存器:BX,CX,DX
HEXTOASCPROCFAR
PUSHBX
PUSHCX
PUSHDX
MOVBX,AX
MOVCL,4;转换AH高4位
SHRAX,CL
ANDAXQFOOH
ADDAH,30H
CMPAH,3AH
JBAl
ADDAH,7
Al:MOVDH,AH
MOVAX,BX;转换AH低4位
ANDAX,OFOOH
ADDAH,30H
CMPAH,3AH
JBA2
ADDAH,7
A2:MOVDL,AH
MOVBH,BL;转换AL高4位
MOVCL,4
SHRBL?CL
ADDBL,30H
CMPBL,3AH
JBA3
ADDBL,7
A3:MOVAH,BL
ANDBH,0FH;转换AL低4位
ADDBH,30H
CMPBH,3AH
JBA4
ADDBH,7
A4:MOVAL,BH
POPDX
POPCX
POPBX
RET
HEXTOASCENDP
(2)子程序名:DISPLAYASC
输入参数:DX,AX:4位ASCII码
输出参数:无
使用寄存器:BX,CX
DISPLAYASCPROCFAR
PUSHBX
PUSHCX
MOVBX,DX
MOVCX,AX
MOVDL,BH
MOVAH,02H
INT21H
MOVDL,BL
INT21H
MOVDL,CH
INT21H
MOVDL,CL
INT21H
MOVDL,'H'
INT21H
POPCX
POPBX
RET
DISPLAYASCENDP
11.某程序可从键盘接收命令(0~5),分别转向6个子程序,子程序入口地址分别为P0〜
P5,编制程序,用跳转表实现分支结构。
答:DATASEGMENT
TABLEDW6DUP(?)
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
LEASI,TABLE
MOVWORDPTR[SI],OFFSETPO
MOVWORDPTR[SI+2],OFFSETPl
MOVWORDPTR[SI+4],OFFSETP2
MOVWORDPTR[SI+6],OFFSETP3
MOVWORDPTR[SI+8],OFFSETP4
MOVWORDPTR[SI+10],OFFSETP5
MOVAH,1
INT21H
SUBAL,30H
SHLALJ
MOVAH,0
MOVSI,AX
JMPTABLE[SI]
PO:
Pl:
P2:
P3:
P4:
P5:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
12.在首地址为TABLE的数组中按递增次序存放着100个16位补码数,编写一个程序,把
出现次数最多的数及其出现次数分别存放于AX和BL中。
答:DATASEGMENT
TABLEDW100DUP(?);数组中的数据是按增序排列的
NUMDW?
COUNTDW0
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:CODE,DS:DATA
START:PUSHDS:设置返回DOS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX;给DS赋值
BEGIN:MOVCX,100;循环计数器
MOVSI,0
NEXT:MOVDX,0
MOVAX,TABLE[SI]
COMP:CMPTABLE[SI],AX;计算一个数的出现次数
JNEADDR
INCDX
ADDSI,2
LOOPCOMP
ADDR:CMPDX,COUNT;此数出现的次数最多吗?
JLEDONE
MOVCOUNT.DX;目前此数出现的次数最多,记下次数
MOVNUM,AX;记下此数
DONE:LOOPNEXT;准备取下一个数
MOVCX,COUNT;出现最多的次数存入(CX)
MOVAX,NUM;出现最多的数存入(AX)
RET
MAINENDP
CODEENDS;以上定义代码段
ENDSTART
13.将键盘上输入的十六进制数转换成十进制数,在屏幕上显示。
答:DATASEGMENT
STRINGDBINPUT4HEXNUM:\0AH,0DH,$
NUMDB10DUP(?)
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
LEADX,STRING;显示提示信息
MOVAH,9
INT21H
MOVBP,4
MOVDX,0
CONT:MOVCL,4;输入4位十六进制数DX
SHLDX,CL
DI:MOVAHJ
INT21H
CMPAL,'O'
JBDI
CMPAL;F
JAD1
CMPAL,A
JBAl
SUBAL,7
Al:SUBAU30H
MOVAH,0
ADDDX,AX
DECBP
JNZCONT
MOVSLO;将DX转换成十进制数,再转换成ASCH码一>NUM
MOVAX,DX
MOVDX,0
MOVBX,10
D2:DIVBX
ADDDL,30H
MOVNUM[SI],DL
INCSI
CMPAX,0
JZEXIT
MOVDX,0
JMPD2
EXIT:MOVDL.0AH;显示十进制数
MOVAH,2
INT21H
MOVDL,0DH
INT21H
D3:DECSI
MOVDL,NUM(SI]
MOVAH,2
INT21H
JNZD3
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
14.将AX中的无符号二进制数转换成ASCII字符串表示的十进制数。
答:将13题输入过程和输出过程去掉即得。
DATASEGMENT
NUMDB10DUP(?);转换后ASCII码按倒序存放于NUM
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVAX,XXXX;无符号二进制数
MOVSI,0;将人*转换成十进制数,再转换成ASCH码一>NUM
MOVDX,0
MOVBX,10
D2:DIVBX
ADDDL,30H
MOVNUM[SI],DL
INCSI
CMPAX,0
JZEXIT
MOVDX,0
JMPD2
EXIT:MOVAH,4CH
INT21H
CODEENDS
ENDSTART
15.从键盘输入20个有符号数,将它们排序并在屏幕上显示。
答:DATASEGMENT
NUMDW20DUP(?);存放20个有符号数
ASCDB10DUP(?);输出时暂时保存每个数的ASCH码
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVCX,20
MOVBX,10
MOVSLO
MOVBP,0
BEGIN:MOVDX,0;输入20个有符号数(十进制),并
A1:MOVAH,1;转化为二进制数存放于NUM数组
INT21H
CMPAL;*;判断是否空格
JZA2
CMPAL,0DH;是否回车符
JZA2
CMPAL;-1;是否
JZA3
JMPA4
A3:MOVBPJ
JMPAl
A4:PUSHAX
MOVAX,DX
MULBX
MOVDX,AX
POPAX
SUBAL,30H
MOVAH,0
ADDDX,AX
JMPAl
A2:CMPBPJ
JNZA5
NEGDX;若为负数,则取负
A5:MOVNUM[SI],DX
MOVBP,0
ADDSI,2
LOOPBEGIN
MOVDL,0DH;回车换行
MOVAH,2
INT21H
MOVDL,0AH
INT21H
MOVBX,0;对20个有符号数按由小到大顺序排序
MOVCX,19;采用冒泡法,排序后依然存放于NUM数组
LI:MOVDX,CX
L2:MOVAX,NUM[BX]
CMPAX,NUM[BX+2|
JLECONTI
XCHGAX,NUM[BX+2]
MOVNUM[BX],AX
CONTI:ADDBX,2
LOOPL2
MOVCX,DX
MOVBX,0
LOOPLI
MOVCX,20;将20个有符号数(二进制)转换为十进制数
MOVSI,0;再转换为ASCII码并输出屏幕
DI:MOVAX,NUM[SI]
ADDSI,2
TESTAXJ000H
JZD4
PUSHAX
MOVDL;-'
MOVAH,2
INT21H
POPAX
NEGAX
D4:MOVDLO
MOVDX,0
MOVBX,10
D2:DIVBX
ADDDL,30H
MOVASC[DI],DL
INCDI
CMPAX,0
JZD3
MOVDX,0
JMPD2
D3:MOVDL,ASC[DI-1|
MOVAH,2
INT21H
DECDI
JNZD3
MOVDL,"
MOVAH,2
INT21H
LOOPDI
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
16.编写多字节有符号数的加法程序,从键盘接收两个加数,在屏幕上显示结果。
答:DATASEGMENT
STRING1DB'INPUTFIRSTNUM(HEX):',0DH,0AH;$,
STRING2DB'INPUTSECONDNUM(HEX):\0DH,0AH;$,
STRING3DBTHERESULTIS(HEX):',0DH,0AH;$,
NUM1DW0,0;存放加数1
NUM2DW0,0;存放加数2
RESULTDB0,0,0,0;存放结果
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
LEADX,STRING1;输入第•个加数(4位十六进制数)
MOVAH,9
INT21H
MOVSI,2
MOVCX,8
CONT:PUSHCX
CMPCX,4
JNZBl
SUBSI,2
Bl:MOVCL,4
SHLNUM1[SI],CL
Cl:MOVAH,1
INT21H
CMPAL;0'
JBC1
CMPAL;F'
JAC1
CMPAL,A
JBAl
SUBAL,7
Al:SUBAL,30H
MOVAH,0
ADDNUM1[SI],AX
POPCX
LOOPCONT
MOVDL,0DH;回车换行
MOVAH,2
INT21H
MOVDL,0AH
INT21H
LEADX,STRING2;输入第二个加数(4位十六进制数)
MOVAH,9
INT21H
MOVSI,2
MOVCX,8
CONTI:PUSHCX
CMPCX,4
JNZB2
SUBSI,2
B2:MOVCL,4
SHLNUM2[SI],CL
C2:MOVAH,1
INT21H
CMPAL,'O'
JBC2
CMPAL;F'
JAC2
CMPAL,'A'
JBA2
SUBAL,7
A2:SUBAL.30H
MOVAH,0
ADDNUM2[SI],AX
POPCX
LOOPCONTI
MOVDL,0DH;回车换行
MOVAH,2
INT21H
MOVDL,0AH
INT21H
LEASLNUM1;两数相加
LEABX,NUM2
LEADLRESULT
MOVCX,4
CLC
AD:MOVAL,[SI]
ADCALJBX]
MOV[DI],AL
INCSI
INCBX
INCDI
LOOPAD
LEADX,STRING3:显示结果(4位十六进制数)
MOVAH,9
INT21H
MOVCX,4
MOVDI,3
TT:PUSHCX
MOVDL,RESULT[DI]
MOVCL,4
SHRDL,CL
ADDDL,30H
CMPDL,3AH
JBDI
ADDDL,7
DI:MOVAH,2
INT21H
MOVDL,RESULT[DI]
ANDDL,0FH
ADDDL,30H
CMPDL,3AH
JBD2
ADDDL,7
D2:MOVAH,2
INT21H
DECDI
POPCX
LOOPTT
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
17.编写2位非压缩型BCD码相乘的程序。
答:转化成加法进行累加运算。
DATASEGMENT
DAIDB09H,09H
DA2DB09H,08H
RESULTDB4DUP(O)
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVAL,DA2+1;计算加法次数
MOVBL,10
MULBL
MOVBL,DA2
MOVBH,0
ADDAX,BX
MOVCX,AX
CONT:MOVAH,0;通过循环做累加
MOVAL,RESULT
ADDAL,DA1
AAA
MOVRESULT,AL
MOVAL,RESULT+1
ADDAL,AH
MOVAH,0
AAA
ADDAL,DA1+1
AAA
MOVRESULT+LAL
MOVAL,RESULT+2
ADDAL,AH
MOVAH,0
AAA
MOVRESULT+2,AL
MOVAL,RESULT+3
ADDAL,AH
MOVAH,0
AAA
MOVRESULT+3,AL
LOOPCONT
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
18.编写完整的程序求N!,求N大于6时的运算结果,并在屏幕上显示结果。
答:DATASEGMENT
NDB8;求8的阶乘
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVAL,N
MOVAH,0
CALLFACT;调用过程求N!,AX=N,BX=N!
CALLB2TODEC;调用过程将结果转换为十进制,然后屏幕显示
MOVAH,4CH
INT21H
FACTPROC
CMPAL,0
JNZCHN
MOVBX,1
RET
CHN:PUSHAX
DECAL
CALLFACT;递归调用N!=N*(N-l)!
POPAX
MULBX
MOVBX,AX
RET
FACTENDP
B2TODECPROC
MOVCX,10000
CALLBIN
MOVCX,1000
CALLBIN
MOVCX,100
CALLBIN
MOVCX,10
CALLBIN
MOVCX,1
CALLBIN
RET
B2TODECENDP
BINPROC
MOVAX,BX
MOVDX,0
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H
RET
BINENDP
CODEENDS
ENDSTART
19.在附加段有一个数组,首地址为BUFF,数组中第一个字节存放了数组的长度。编一个
程序在数组中查找0,找到后把它从数组中删去,后续项向前压缩,其余部分补0。
答:DATASEGMENT
BUFFDB10,1,0,2,340,5,6,7,0;10个数
MEQU0
DATAENDS
CODESEGMENT
ASSUMECS:CODE,ES:DATA,DS:DATA
START:MOVAX,DATA;初始化ES,DS
MOVES,AX
MOVDS,AX
MOVAL,M;关键字M存入AL
MOVDLOFFSETBUFF
MOVCL,[DI];数组长度存入CX
MOVCH,0
INCDI;指向数组起始地址
CLD;清方向标志
LI:REPNESCASB;重复搜索关键字
JNZSTOP;未找到,转STOP结束
JCXZSTOP;最后一个数是M,转STOP
PUSHDI;关键字下一单元地址和循
PUSHCX;环次数入栈保护
DEL:MOVBL,[DI];前移,末尾补0
MOV[DI-1],BL
INCDI
LOOPDEL
MOVBYTEPTR[DI-l],0
POPCX;恢复CX,DI
POPDI
DECDI;由于REPNESCASB已自动加1
JMPLi
STOP:MOVAH,4CH
INT21H
CODEENDS
ENDSTART
20.编程完成将第二个字符串插入到第•个字符串的指定位置上。
答:DATASEGMENT
STRING1DB'THISISTHEFIRSTSTRING!','$'
DB100DUP(O);缓冲区
NUM1DW?;字符串1的长度
STRING2DB'thesecondstring!',
NUM2DW?;字符串2的长度
POSDW8;插入位置
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA
START:MOVAX,DATA
MOVDS,AX
MOVES,AX
LEADLSTRING1:求字符串1的长度存入NUM1
MOVAL,$
MOVNUM1,0
CLD
DI:SCASB
JZD2
INCNUM1
JMPD1
D2:LEADLSTRING2;求字符串2的长度存入NUM2
MOVAL,$
MOVNUM2,0
CLD
D3:SCASB
JZD4
INCNUM2
JMPD3
D4:LEASI,STRING1;将字符串1自插入位置开始的字符向后移动,
ADDSI,NUM1;空出位置以便插入字符串2
MOVDI,SI
ADDDI,NUM2
STD
MOVCX,NUMI
SUBCX,POS
INCCX
REPMOVSB
LEASLSTRING2;将字符串2插入到字符串1指定位置
LEADLSTRING1
ADDDLPOS
CLD
MOVCX,NUM2
REPMOVSB
LEADX,STRING1
MOVAH,9
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
21.将学生的班级、姓名、学号、课程名、成绩定义为一个结构,用结构预置语句,产生5
个学生的成绩登记表,编程序将成绩小于60分的学生姓名、成绩显示出来。
答:STUDENTSTRUC
CLASSDB?;班级
NAMDB'ABCDES';姓名
NUMDB?;学号
COURSEDB'ABCD';课程
SCOREDB?;成绩
STUDENTENDS
DATASEGMENT
STUDENT1STUDENT<1;XIAOA$',00iATH',70>
STUDENT2STUDENT<1;XIAOB$',002;MATH,.80>
STUDENT3STUDENT<1:XIAOC$,,003;MATH;50>
STUDENT4STUDENTvl;XIAOD$\004;MATH:90>
STUDENT5STUDENT<1,'XIAOE$\005;MATH;55>
DATAENDS
CODESEGMENT
ASSUMECS:CODE,ds:DATA
START:MOVAX,DATA
MOVDS,AX
MOVCX,5:通过循环结构进行筛选
MOVSI,0
CONT:MOVAL,STUDENT1.SCORE[SI];取成绩
CMPAL,60
JAEDI
LEADX,STUDENTI.NAM[SI];小于60则显示姓名和成绩
MOVAH,9
INT21H
MOVDL;'
MOVAH,2
INT21H
MOVAL,STUDENT1.SCORE[SI];成绩转换为ASCII祀马显示
MOVAH,0
MOVBL,10
DIVBL
PUSHAX
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H
POPAX
MOVDL,AH
ADDDL,30H
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
INT21H
DI:ADDSI,13
LOOPCONT
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
22.编程序统计学生的数学成绩,分别归类90分〜99分,80分〜89分,70分〜79分,60
分〜69分及60分以下,并将各段的人数送入内存单元中。
答:设学生人数为字节,成绩为压缩BCD码,且都是合法的。
DATASEGMENT
BUFFDBXXH,........
ANUMEQUS-BUFF
SNUMDB5DUP(O);存放各类成绩统计结果
BUFFIDBANUMDUP(O);存放60分以下成绩
BUFF2DBANUMDUP(O);存放60分〜69分成绩
BUFF3DBANUMDUP(O);存放70分〜79分成绩
BUFF4DBANUMDUP(O);存放80分〜89分成绩
BUFF5DBANUMDUP(O);存放90分以上成绩
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA,ES:DATA
START:MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVCL,ANUM;取学生人数
MOVCH,0
MOVBH,0
MOVSLOFFSETBUFF
MOVDI,OFFSETSNUM
DI:MOVAL,[SI]
CMPAL,60H
JAENEXT1
MOVBL,[DI]
MOVBUFFI[BXLAL
INCBYTEPTR[DI]
JMPNEXT5
NEXT1:CMPAL,69H
JANEXT2
MOVBL,[DI+1]
MOVBUFF2[BX].AL
INCBYTEPTR[DI+1]
JMPNEXT5
NEXT2:CMPAL,79H
JANEXT3
MOVBLJDI+2]
MOVBUFF2[BX].AL
INCBYTEPTR[DI+2]
JMPNEXT5
NEXT3:CMPAL,89H
JANEXT4
MOVBL,[DI+3]
MOVBUFF3[BX],AL
INCBYTEPTR[DI+3]
JMPNEXT5
NEXT4:MOVBLJDI+4]
MOVBUFF4[BX]?AL
INCBYTEPTR[DI+4]
NEXT5:INCSI
LOOPDI
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
23.编制宏定义,将存储器区中•个用于结尾的字符串传送到另•个存储器区中,要求源地
址、目的地址、串结尾符号可变。
答:SENDMACROSCHARS,DCHARS,FLAG
LOCALNEXT,EXIT;LOCAL用于解决宏定义内的标号问题
PUSHAX;SCHARS源串地址,DCHARS目的串地址
PUSHSI;FLAG串结尾符号
MOVSI,0
NEXT:MOVAL,SCHARS[SI]
MOVDCHARS[SI],AL
CMPAL,FLAG
JZEXIT
INCSI
JMPNEXT
EXIT:POPSI
POPAX
ENDM
24.定义宏指令名FINSUM:它完成比较两个数X和Y,若X>Y,则执行X+2*Y结果送到
SUM,若XWY,则执行2*X+Y结果送到SUM。
答:FINSUMMACROX,Y,SUM
IFXGTY
MOVAX,Y
SHLAX,1
ADDAX,X
MOVSUM,AX
ELSE
MOVAX,X
SHLAX,1
ADDAX,Y
MOVSUM,AX
ENDIF
ENDM
25.DOS功能调用需要在AH寄存器中存放不同的功能码,试将这些功能调用定义成宏指令
DOS,再定义宏指令DISP,完成显示字符的功能,并展开宏调用DISP,*、
答:DOSMACRONUM
MOVAH,NUM
INT21H
ENDM
DISPMACROZIFU
MOVDL,ZIFU
DOS02H
ENDM
宏调用:DISPe
宏展开:MOVDLJ*'
MOVAH,02H
INT21H
26.编一段程序产生乐曲。
答:演奏儿歌《一闪一闪亮晶晶》
11|55|66|5-144|33|22|1-|
55|44|33|2-|55|44|33|2-|
11|55|66|5-|44|33|22|1-||
DATASEGMENT
FREQUECYDW65535,262,294,330,349,392,440,494;各音阶频率,65535对应0,
DW523,578,659,698,784,880,988;表示不发声
DW1046,1175,1318,1397,1568J760J976
TABLEDW0,8,8,12,12,13,13,12,0,11,11,10,10,9,9,8,0;乐谱各音符频率在
DW12,12,11,11,10,10,9,0,12,12,11,11,10,10,9,0;FREQUECY中的相对
DW8,8,12,12,13,13,12,0,11,11,10,10,9,9,8,0;位置
DATAENDS
CODESEGMENT
ASSUMECS:CODE,DS:DATA
START:MOVAX,DATA
MOVDS,AX
MOVBP,49;CISHU
LEASI,TABLE
CONT:MOVBXJSI]
INCSI
INCSI
SHLBX,1
MOVDIJFREQUECY+BX]
CALLPLAY
DECBP
JNZCONT
EXIT:MOVAH,4cH
INT21H
PLAYPROC
MOVAL,10110110B
OUT43H,AL
MOVDX,12H
MOVAX,34DEH
DIVDI
OUT42H,AL
MOVAL,AH
OUT42H,AL
INAL,61H
MOVAH,AL
ORAL,03H
OUT61H,AL
MOVCX,0FFFFH
DELAY:MOVDX.1700H
GOON:DECDX
JNZGOON
LOOPDELAY
INAL,61H
MOVAH,AL
ANDAL,0FCH
OUT61H,AL
MOVCX,0FFFFH
DELAY1:MOVDXJ00H
GOON1:DECDX
JNZGOON1
LOOPDELAY
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO/TS 19144-3:2024 EN Geographic information - Classification systems - Part 3: Land Use Meta Language (LUML)
- 企业开业庆典致辞范文
- 九月学校迎新致辞(7篇)
- 主持人大赛策划书
- 测量实习报告范文十篇
- 中秋节国旗下的讲话稿(15篇)
- 壮族课件教学课件
- 3D立体风立体商务模板
- 文书模板-诊所负责人与诊所法人的免责协议书
- 影响和谐校园建设的负面因素调查方案
- 电梯保养年度作业计划表格
- 医院月考核指标及评价办法
- 监理例会记录表
- 阿米巴经营课件
- 二年级(上)音乐第四单元 单元分析
- 道路运输企业职业安全健康管理工作台帐(全版通用)参考模板范本
- 中国小学生生命教育调查问卷
- 通用模板-封条模板
- 集团公司后备人才选拔培养暂行办法
- 第五章旅游餐饮设计ppt课件
- 从马克思主义视角看当前高房价
评论
0/150
提交评论