汇编语言补充作业和答案分析解析Word文件下载.docx
《汇编语言补充作业和答案分析解析Word文件下载.docx》由会员分享,可在线阅读,更多相关《汇编语言补充作业和答案分析解析Word文件下载.docx(17页珍藏版)》请在冰点文库上搜索。
![汇编语言补充作业和答案分析解析Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/78be7e69-b36e-41c3-9069-4e7a39da67ff/78be7e69-b36e-41c3-9069-4e7a39da67ff1.gif)
16+(BP)+(DI)
MOVAX,[BX][SI]
MOVAX,[BX+DI]
MOVAX,[BP][SI]
MOVAX,[BP+DI]
基址变址相对寻址
16+(BX)+(SI)+位移量
16+(BX)+(DI)+位移量
PA=(SS)×
16+(BP)+(SI)+位移量
16+(BP)+(DI)+位移量
MOVAX,BUFF[BX][SI]
MOVAX,BUFF[BX+DI]
MOVAX,BUFF[BP][SI]
MOVAX,BUFF[BP+DI]
2.指出下列8088指令的错误:
(1)MOVAH,BX
(2)MOV[BX],[SI]
(3)MOVAX,[SI][DI]
(4)MOVMYDAT[BX][SI],ES:
AX
(5)MOVBL,1000
(6)MOVCS,AX
(7)MOVDS,BP
(8)XLATBX
(9)INAX,0382H
(10)OUTAX,20H
答:
(1)两个操作数长度不一致
(2)两个操作数不能都是存储器操作数
(3)变址寻址方式不能使用两个变址寄存器
(4)寄存器寻址没有段超越用法
(5)两个操作数长度不一致(或1000超出字节数据范围)
(6)CS不能做目的寄存器
(7)段寄存器只能由通用寄存器对其操作,BP不能对通用寄存器进行操作
(8)XLAT中BX是隐含操作数
(9)IN指令中16位端口地址要用DX作为操作数
(10)OUT指令两个操作数反了
3.按要求编写下面的程序段
1)利用移位指令计算DX=3×
AX+7×
BX,假设为无符号数运算,无进位。
2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的互相转换
3)把DX.AX中的双字右移4位
4)假设从4A00H:
0000开始的4个字节中存放了4个非压缩的BCD码,现在按照低地址对低位,高地址对高位的原则,将他们合并到DX中。
1)MOVCX,AX
SHLAX,1;
AX*2
ADDAX,CX;
AX*3
MOVDX,BX
MOVCL,3
SHLDX,CL;
BX*8
SUBDX,BX;
BX*7
ADDDX,AX
2)MOVAL,’0’
LOP:
ANDAL,0FH
INCAL
CMPAL,‘:
’
JNELOP
MOVAL,0
LOP1:
ORAL,30H
CMPAL,0AH
JNELOP1
3)MOVCL,4
SHRAX,CL
MOVBL,DL
SHRDX,CL
SHLBL,CL
ORAH,BL
4)MOVAX,4A00H
MOVDS,AX
MOVCL,4
MOVSI,0
MOVAL,[SI]
MOVDL,AL
INCSI
SHLAL,CL
ORDL,AL
MOVDH,AL
ORDH,AL
4.请说明下面两段程序的功能
1)movsi,600h
movdi,601h
movax,ds
moves,ax
movcx,256
std
repmovsb
2)cld
movax,0fefh
movcx,5
movbx,3000h
moves,bx
movdi,2000h
repstosw
1)从DS:
600H开始将向低地址方向的256字节向高地址移动一个字节位置。
2)从3000:
2000h开始连续存放5个0fefh
5.假设DS=2000H.BX=1256H,SI=528FH,位移量TABLE=20A1H,[232F7H]=3280H,[264E5H]=2450H,试问执行下列段内间接寻址的转移指令后,转移到有效地址是什么?
i.JMPBX
ii.JMPTABLE[BX]
iii.JMP[BX][SI]
答:
(1)1256H
(2)3280H(3)2450H
6.判断下列程序段跳转到条件
(1)XORAX,1E1EH
JEEQUAL
(2)TESTAL,10000001B
JNZTHERE
(3)CMPCX,64H
JBTHERE
(1)(AX)=1E1EH
(2)(AL)的最高位和/或最低位为1(3)(CX)<
64H
7.如果条件跳转指令的跳转目标范围超出-128~127的范围,该如何处理?
举例说明。
可以把跳转条件做一些调整,利用无条件跳转的跳转范围大,来达到目的,如:
CMPAX,33
JELONG
……;
大于127字节
LONG:
改为:
JNESHOETER
JMPLONG
SHORTER:
……;
大于127字节
……
8.按要求编写下面的程序段
1)当DX高4位全为0时,使AX=0,否则AX=-1。
2)已知字符串string包含有256BYTE的内容,将其中所有的‘$’符号替换成空格(‘’)。
3)所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串‘ABCDEFFEDCBA’就是一个回文字符串,而字符串‘ABCFDDCAB’就不是回文字符串。
现在有一个字符串string,包含有16个字节的内容,请编写程序段,判断该字符串是否为回文字符串。
4)统计以‘$’字符结束的字符串string的字符个数。
1)
TESTDX,0F0H
JZOK1
XORAX,AX
JMPOK2
OK1:
MOVAX,-1
Ok2:
…
2)
MOVCX,256
MOVAL,‘$’
MOVAH,‘’
LEABX,string
LP:
CMP[BX],AL
JNZNEXT
MOV[BX],AH
NEXT:
INCBX
DECCX
JNZLP
3)
LEASI,string
MOVDI,15
ADDDI,SI
CMPAL,[DI]
JNZNO;
不是回文
DECDI
CMPSI,DI
JBLP
是回文
NO:
……;
4)
MOVCX,0;
放字符个数
LEASI,string
CMPAL,’$’
JEEXIT
INCCX
JMPLP
EXIT:
9.设置CX=0,则LOOP指令将执行多少次?
例如:
movcx,0
delay:
loopdelay
将执行65536次
10.在下面程序段的括号中如果分别放上下面的指令
(1)LOOPL20
(2)LOOPNEL20
(3)LOOPEL20
试说明,当程序执行完时AX,BX,CX,DX四个寄存器的内容分别是什么?
MOVAX,01
MOVBX,02
MOVCX,03
MOVDX,04
L20:
INCAX
ADDBX,AX
SHRDX,1
()
RET
(1)(AX)=4,(BX)=11,(CX)=0,(DX)=0
(2)(AX)=4,(BX)=11,(CX)=0,(DX)=0
(3)(AX)=2,(BX)=4,(CX)=2,(DX)=2
11.下面两条短转移指令的转移地址A10和A20分别是多少?
(用16进制来表示)
(1)0110EBF7JMPA10
(2)0110EB09JMPA20
指令地址(16进制)指令码汇编语句
(1)A10=0109H
(2)A20=011BH
12.按要求编写下面的程序段
1)将ELEMS中的100个字节数据的位置颠倒过来(即第一个字节和第100个字节的内容交换,第二个字节和第99个字节的内容交换……)。
2)有两个3位的ASCII码字串ASC1和ASC2定义如下:
ASC1DB‘578’
ASC2DB‘694’
ASC3DB‘0000’
请编写计算ASC3=ASC1+ASC2的程序段。
3)编写四字节ASCII码串‘3785’与ASCII数码‘5’相乘的程序段。
LEASI,ELEMS
MOVDI,SI
ADDDI,99
MOVCX,50
LP:
XCHGAL,[DI]
XCHGAL,[SI]
2)
CLC;
清CF
PUSHF
LEASI,ASC1+2;
从个位开始加,DB'
578'
等同于DB'
5'
'
7'
8'
LEADI,ASC2+2
LEABX,ASC3+3
MOVCX,3;
计算的数有位
A20:
MOVAH,0
MOVAL,[SI]
SUBAL,30H;
;
ASCII码转BCD码
MOVDL,[DI]
SUBDL,30H;
ASCII码转BCD码
POPF
ADCAL,DL
AAA;
非压缩BCD码加法调整
ADDAL,30H;
BCD码转ASCII码
MOV[BX],AL
DECSI
DECBX
LOOPA20
ADDAH,30H
MOV[BX],AH
MOVCX,4
LEASI,MULCND+3
LEADI,PRODUCT+4
ANDMULPLR,0FH;
A30:
ANDAL,0FH;
ASCII码转BCD码
MULMULPLR
AAM;
BCD码乘调整
ADDAL,[DI]
BCD码加法调整
ORAL,30H
MOV[DI],AL
MOV[DI],AH
LOOPA30
ORBYTEPTR[DI],30H
13.请编写完整程序在一个升序字节数组中查找数N,找到后将此数从数组中删除,并使得CF=0;
没找到返回CF=1。
数组的首地址和末地址为A_HEAD和A_END。
DATASEGMENTPARA'
DATA'
A_HEADDW?
BUFFDB1,2,3,4,5,6,7,8,9,0
COUNTEQU$-BUFF
A_ENDDW?
NDB4
DATAENDS
CODESEGMENTPARA'
CODE'
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETBUFF
MOVA_HEAD,SI
MOVAL,COUNT
CBW
ADDAX,SI
MOVDI,AX
MOVA_END,DI
MOVAL,N
CMPAL,[SI]
JNENEXT
JMPDEL
INCSI;
考察下一个数据
CMPSI,DI
JBELP;
循环
STC;
CF<
-1
JMPEXIT
DEL:
-0
JNEDELDATA
DECA_END;
删除的是最后一个元素
DELDATA:
MOVCX,DI
SUBCX,SI
LP2:
MOVAL,[SI+1];
该循环将SI+1到DI位置的数据移动到SI到DI-1的位置
MOV[SI],AL
LOOPLP2
调整结尾指针
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
14.请编写完整程序从键盘读取字符,如果是十进制的‘0’~‘9’则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是’Q’或者‘q’,则程序退出,其他情况在屏幕上打印“Youmustinput0~9,or‘q’or‘Q’”。
(如输入的字符是‘9’,则输出“00001001”)
提示:
语句“Youmustinput0~9,or‘q’or‘Q’”定义成以’$’结尾的字符串,键盘输入和屏幕输出,请参看教材后的DOS功能调用(int21h)的相关功能。
输出一个数的2进制形式应该从最高位开始输出,可以将此段程序定义成一个过程。
'
"
Youmustinput0~9,or'
q'
or'
Q'
。
DATASEGMENTPARA'
sentencedb'
Youmustinput0~9,or"
q"
or"
Q\"
$'
bufdb20dup(?
)
MAINPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVSI,0
DOIT:
MOVAH,1
CMPAL,'
JNENEXT1
NEXT1:
SUBAL,30H
JCPRINT
JMPNEXT2
PRINT:
MOVAH,9
LEADX,SENTENCE
CALLCRLF
JMPDOIT
NEXT2:
CMPAL,9
JGPRINT
MOVCX,8
PRNDATA:
SHLAL,1
JCIS1
MOVDL,'
0'
JMPOUTBIN
IS1:
1'
OUTBIN:
MOVAH,2
POPAX
LOOPPRNDATA
RET
MAINENDP
CRLFPROCNEAR;
回车换行
PUSHDX
MOVDL,0DH;
回车
MOVAH,2
INT21H;
输出DL中的字符
MOVDL,0AH;
换行
POPDX
CRLFENDP
ENDMAIN