汇编语言课后习题答案郑晓薇后的.docx
《汇编语言课后习题答案郑晓薇后的.docx》由会员分享,可在线阅读,更多相关《汇编语言课后习题答案郑晓薇后的.docx(18页珍藏版)》请在冰点文库上搜索。
汇编语言课后习题答案郑晓薇后的
ModifiedbyJEEPonDecember26th,2020.
汇编语言课后习题答案郑晓薇后的
习题一
1
2
5E8AH,0BE6H,3DEH,4940H
3
00011101+00110101=01010010=52H=82
4
5000020A3H,FF94H,00003456H,007FH,FFFFEC00H
6无符号数:
0~65535,0000H~FFFFH;带符号数:
-32768~+32767,8000H~7FFFH
7
(1)38H等于十进制数56,是十进制数56的补码,数字8的ASCII码,十进制数38的压缩BCD码
(2)FFH等于十进制数-1,是带符号数-1的补码,无符号数为255(3)5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码(4)0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码
8
(2)46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H
9
(1)56+63=01110111B,CF=0,SF=0,ZF=0,OF=0
(2)83-45=00100110B,CF=0,SF=0,ZF=0,OF=0(4)-92-37=01111111B,CF=1,SF=0,ZF=0,OF=1
10
回车、换行、响铃、ESC键、空格键、@、P、p
习题二
9最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节)
10CS:
IP,DS:
BX、SI、DI,ES:
BX、SI、DI,SS:
SP、BP
11字节单元保存8位数,字单元保存16位数。
根据源操作数的属性确定要访问的是字节单元还是字单元。
12对于字节单元来说,偶地址和奇地址一样;对于字单元而言,最好用偶地址保存,可减少CPU的访存次数。
13首单元的物理地址=38AE8H,末单元的物理地址=38AE8H+7FFFH=40AE7H
16
(1)物理地址=27679H
(2)物理地址=20F92H(3)物理地址=20F92H
(2)和(3)的物理地址是一样的。
说明逻辑地址不唯一,多个逻辑地址可对应到同一个物理单元上。
17代码段CS:
IP的物理地址=55A84H堆栈段SS:
SP的物理地址=4DB65H数据段DS:
BX的物理地址=17678H附加段ES:
DI的物理地址=2BA41H
18当前栈指针所指单元的物理地址是1522CH。
堆栈区中还能保存254个字。
19执行E200
20执行U100
21执行RCX,然后输入100
22执行EDS:
0‘a’‘b’‘c’‘d’
习题三
3MOVAX,BX源操作数为寄存器寻址,EA无,物理地址无
MOVAX,1290H立即寻址,EA无,物理地址无
MOVAX,[BX]寄存器间接寻址,EA=1290H,物理地址=2FBB0H
MOVAX,DS:
[1290H]直接寻址,EA=1290H,物理地址=2FBB0H
MOVAX,[BP]寄存器间接寻址,EA=6756H,物理地址=26A56H
MOV[DI][BX],AX目的操作数为基址变址寻址,EA=3C06H,物理地址=32526HMOVES:
[SI],AX寄存器间接寻址,EA=348AH,物理地址=50CAAH
7
MOVAX,[CX]错。
CX不能为间址寄存器MOVAL,1200H错。
立即数超出8位寄存器范围MOVAL,BX错。
两个操作数不匹配MOV[SI][DI],AX错。
两个变址寄存器不能在一起MOVES:
[DX],CX错。
DX不能为间址寄存器MOV[AX],VALUE错。
AX不能为间址寄存器MOVCOUNT,[SI]错。
两个操作数不能都是存储单元
8
(1)MOVAX,BX
(2)MOVCL,15(3)ADDAX,[BX](4)MOV[BX+SI],AL(5)MOVAX,VALUE[SI](6)SUBAX,DS:
[2000H]
9
(1)ADDAX,[X+4]MOVY,AX
(2)MOVBX,4ADDAX,X[BX]MOVY,AX(3)MOVBX,4MOVSI,OFFSETXADDAX,[BX+SI]MOVY,AX
10立即寻址方式中操作数(立即数)和指令一起存放在代码段中。
习题四
10
(1)DATASEGMENT
XDW0
YDW0
DATAENDS
(2)STRINGDB’Computer’
(3)COUNTDB100DUP()
(4)PIEQU(5)VALUELABELBYTE
11
(1)对。
(2)错。
260超出了字节范围。
(3)错。
X3是字节型,1234H是字型,不匹配。
(4)对。
(5)错。
缺少DUP。
(6)对。
12
(1)AL=3。
(2)AX=2103H。
(3)DX=TABLE的偏移地址。
(4)CL=33H(5)BX=TABLE的段地址。
(6)BX=1。
(7)DX=TABLE的偏移地址。
13
MOVDX,2012H
MOVAX,5D68H
MOVCX,1003H
MOVBX,49A6HADDAX,BX(SUBAX,BX)ADCDX,CX(SBBDX,CX)
14SUBAX,CXSBBDX,0
15MOVAX,extraMOVES,AX
16
(1)MOVAL,16ADDAL,XMOVBL,5IMULBLMOVZ,AX
(2)MOVBL,4MOVAL,XIDIVBLSUBAL,YMOVZ,AX(3)MOVAL,XMOVBL,8IMULBLMOVDX,AXMOVAH,0MOVAL,YMOVBL,16IDIVBLCBWADDDX,AXMOVAH,0MOVAL,WIMULALSUBDX,AXMOVZ,DX(4)MOVAL,XADDAL,YMOVBL,XSUBBL,YMOVAH,0IMULBLMOVZ,AXMOVAL,XIDIVYCBWSUBZ,AX
17Z=(5+22-15)*14=168
18从伪指令ENDSTART处获知程序从START标号开始。
19
(1)减法:
(2)加法:
MOVAX,8576HMOVAX,8576H
MOVBX,9988HMOVBX,9988H
SUBAX,BXADDAX,BX
结果:
AX=EBEEH结果:
AX=1EFEH
CF=1,OF=0,ZF=0,SF=1CF=1,OF=1,ZF=0,SF=0
21
(1)MOVAL,56HMOVBL,34HADDAL,BLDAAMOVY1,AL
(2)MOVAX,128HMOVBX,35HSUBAX,BXDASMOVY2,AL(3)MOVAL,68HMOVBL,23HADDAL,BLMOVBL,45HSUBAL,BLDASMOVY3,AL
22
(1)MOVAX,0708HMOVBX,0406HADDAL,BLADDAH,BH;不用带进位加AAA;加法调整,含进位调整MOVBX,AXXCHGAH,AL;高4位调整AAAMOVBH,ALMOVZ1,BX;保存十位、各位,百位在CF中
(2)MOVAX,0905HMOVBX,0207HSUBAL,BLSUBAH,BH;不用带借位减AAS;减法调整MOVZ2,AX(3)MOVAX,0102HMOVBX,0006HMULBX;乘法先不用调整MOVBX,0303HSUBAX,BXAAS;减法调整MOVZ3,AX(4)MOVAX,0704HMOVBX,0108HADDAL,BLADDAH,BHAAA;加法调整MOVBL,6AAD;除法调整DIVBLMOVBH,AH;余数保存在BHANDAX,000FHAAA;商调整MOVZ4,AX;保存商
23
.modelsmall
.data
buffdb
.code
start:
movax,@data
movds,ax
movah,1;键盘输入
int21h
subal,30h;去掉ASCII码
movbuff,al
movah,4ch
int21h
endstart
24
.modelsmall.codestart:
movah,1;键盘输入int21hsubal,20h;变为大写movdl,almovah,2int21hmovah,4chint21hendstart
25
.modelsmall.dataxdb12hydb34h.codestart:
movax,@datamovds,axmoval,xaddal,y;结果为46Hmovah,al;AH=46Handal,0fh;AL=06Hmovcl,4rolah,cl;AH=64Handah,0fh;AH=04Haddax,3030h;AX=3436Hmovbx,axmovdl,bh;显示4movah,2int21hmovdl,bl;显示6int21hmovah,4chint21hendstart
26
datasegment
xdb'','','','',''
db'','','','','';建立字符表
ydb5dup();存放查到平方根udb3;要查的数dataendscodesegmentassumecs:
code,ds:
datastart:
movax,datamovds,axmoval,u;要查的数movcl,5mulcl;u*5=15(号单元开始)movah,0movbx,ax;地址保存到bxmovsi,0let1:
moval,x[bx];取出平方根数字movy[si],al;存入yincsiincbxlooplet1;循环取出5次movah,4chint21hcodeendsendstart
27
.modelsmall.datax1db'zhangyan$';姓名为10个字符宽度x2db'lili$'x3db'wanglan$'x4db'zhaoxue$'x5db'lijiang$'udb3;要查的学号.codestart:
movax,@datamovds,axmoval,u;给出学号movcl,10mulcl;u*10=30(号单元开始)movah,0movdx,ax;地址保存到dxmovah,9;9号功能显示字符串int21hmovah,4chint21hendstart
28编程实现公式计算Z=X/4+16Y。
.modelsmall
.data
xdb4
ydb6
zdb
.code
start:
movax,@data
movds,ax
moval,x;
movcl,2
saral,cl;X/4
movcl,4
movbl,y
salbl,cl;16Y
addal,bl;X/4+16Y
movz,al
movah,4ch
int21h
endstart
29
.modelsmall
.data
ydb,
.code
start:
movax,@data
movds,ax
moval,3;设al=3
movcl,6
mulcl;al*6
movcl,4;设cl=4
subal,cl;相减
movbl,3
idivbl;/3
movy,al;商
movy+1,ah;余数
movah,4ch
int21h
endstart
习题五
11进位标志CF=1
12先把AX的值除以8等于0246H,再把高12位屏蔽为0,剩下AL=06H加上30H变为ASCII码显示出来。
13
判断X>0,是,Z=X-Y;否则Z=X的绝对值
14
(1)目的操作数是存储单元时,要用PTR伪操作指出单元的属性
(2)DS段寄存器使用非法(3)立即数使用非法(4)目的操作数不允许是立即数(5)两个操作数不允许都是存储单元(6)移位次数超过1要用CL表示。
15
16
(1)AL=30H
(2)AL=B7H(3)AL=C8H(4)AL=38H
27分支程序设计。
完成如下公式的计算,请写出程序。
(X+3)/2X>0
Y=0X=0
X×4X<0
程序如下:
DATASEGMENT
XDB23
YDB
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,X
CMPAL,0
JESUB2
JGSUB1
MOVCL,2
SALAL,CL
JMPSHORTSUB2
SUB1:
ADDAL,3
SARAL,1
SUB2:
MOVY,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
28
设X、Y、Z为字节单元。
如果X≥0,Z=4X-Y/16,否则,Z=X的绝对值。
编程序实现。
程序如下:
DATASEGMENT
XDB3
YDB5
ZDB
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,X
CMPAL,0
JLSS1
MOVCL,2
SALAL,CL
MOVBL,Y
MOVCL,4
SARBL,CL
SUBAL,BL
JMPOUT1
SS1:
NEGAL
OUT1:
MOVZ,AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
29字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO单元。
程序如下:
DATA1SEGMENT
MDW21,-34,32,112,-324,0,76,0,48,50
POSIDW
NEGADW
ZERODW
DATA1ENDSCODE1SEGMENTASSUMECS:
CODE1,DS:
DATA1START:
MOVAX,DATA1MOVDS,AXMOVCX,10LEASI,MAGAIN:
CMPWORDPTR[SI],0JLLOWERJEEQUALINCPOSIJMPLPP1LOWER:
INCNEGAJMPLPP1EQUAL:
INCZEROLPP1:
ADDSI,2DECCXJNZAGAINMOVAH,4CHINT21HCODE1ENDSENDSTART
30试编写程序,从键盘接收一英文单词,以空格结束,将其存入BUF开始的存储单元中,并在最后加上字符串结束符’$’。
主要程序部分:
LEABX,BUFLOP:
MOVAH,1INT21HCMPAL,20HJENEXTMOV[BX],ALINCBXJMPLOPNEXT:
MOVBYTEPTR[BX],’$’
31
编程。
将AX寄存器中的16位数分成4组,每组4位,从低到高分别放在AL,BL,CL,DL中。
程序段:
START:
MOVAX,1234HMOVBX,AXANDAL,0FH;4ANDBL,0F0H;3ANDAH,0FHMOVCL,AH;2ANDBH,0F0HMOVDL,BH;1
习题六
11累加和TOTAL=83
12循环统计X中0的个数
13
(1)将BB1:
RCLAL,1改为BB1:
ROLAL,1
(2)将BB2:
CMP[BX],’T’
LOOPNEBB2改为:
DECBXBB2:
INCBXCMP[BX],’T’LOOPNEBB2
15计算Y=1×2+3×4+5×6+7×8+9×10的程序段答案:
MOVAL,1MOVBL,2MOVDX,0MOVCX,5AA1:
MULBLADDDX,AXINCBLMOVAL,BLINCBLLOOPAA1
16写程序段。
查找CATT表中的字符”@”,找到后将SIGN单元置1,否则SIGN单元置0。
cattdb'asd@ddd'
signdb
……
movax,extra
moves,ax
movsign,0
moval,'@'
leadi,catt
cld
movcx,7
repnzscasb
jcxznee
movsign,1
nee:
movah,4ch
int21h
17写程序段。
在长度为N的字数组VALUE中统计负数的个数并保存到AX中。
valuedw2,-4,-5,3,6,6,-8nequ($-value)/2;元素个数……start:
movax,datamovds,axmovcx,nmovbx,0movax,0rept1:
movsi,value[bx];取出元素cmpsi,0jgelet1;≥0转let1incax;为负数,ax加1let1:
addbx,2looprept1
18从键盘输入一个数字,在屏幕上显示出以该数字开始10个数字串。
CODESEGMENT
ASSUMECS:
CODE
START:
MOVAH,1
INT21H
MOVCX,10
MOVBL,ALREPT1:
CMPBL,'9'JLENEXTSUBBL,10NEXT:
MOVDL,BLMOVAH,2INT21HINCBLLOOPREPT1MOVAH,4CHINT21HCODEENDSENDSTART
19
datasegmentbunch1db'stadent'bunch2db'studEnt'dataendscodesegmentassumecs:
code,ds:
data,es:
datastart:
movax,datamovds,axmoves,axleasi,bunch1leadi,bunch2movbx,0;bh=相同的个数,bl=不同的个数movcx,7let1:
moval,[si]cmpal,[di];两字符比较jzequl;相同转equlincbl;不同bl加1jmpout1equl:
incbhout1:
incsiincdilooplet1movdl,'n';显示'n',代表不同movah,2hint21haddbl,30h;加上ASCII码movdl,bl;显示不同的个数int21hmovdl,'e';显示'e',代表相同int21haddbh,30hmovdl,bh;显示相同的个数int21hmovah,4chint21hcodeendsendstart
21
DATASEGMENT
STRDB‘SDABFGH0’DATAENDSCODESEGMENTASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AXLEADI,STRSPACE:
MOVCX,10MOVAL,[DI]CMPAL,0JEOUTCMPAL,20HJEDELETEJMPEXITSUBCX,DIMOVSI,DIDELETE:
MOVBL,[SI+1]MOV[SI],BLINCSILOOPDELETEEXIT:
JMPSPACEOUT:
MOVAH,4CHINT21HCODEENDSENDSTART
23设计思路:
(1)用EQU伪指令获得需转换的十进制数的个数;
(2)用双重循环。
外循环控制个数,用x作为中间变量;(3)内循环将一个3位十进制数去掉ASCII码后按位数扩大10倍再相加,保存后即存储为二进制数;(4)分两个数组保存ASCII码表示的十进制数和转换后的二进制数。
程序如下:
;将内存中用ASCII码表示的100以内的十进制数转变为二进制数
datasegment
score1db36h,37h,20h,31h,30h,30h,38h,35h,20h,31h,30h,30h;即67,100,85,100
xdw
nequ3;三位数
numequ(x-score1)/n;十进制数个数
score2dwnumdup(0);保存转换后的二进制数
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movcx,num
movsi,-2
movbx,0
rept1:
pushcx;保存外循环次数
movcx,n
rept2:
moval,score1[bx];从score1取数
cmpal,30h;判断是否0-9
jlexit
cmpal,39h
jgexit
andax,000fh;去掉ASCII码
xchgax,x
movdx,10;将ax中前一次形成的数扩大10倍
muldx
xchgax,x
addx,ax;相加后保存到x
exit:
incbx;取下一位数
looprept2
popcx;弹出外循环次数
addsi,2
movax,x
movscore2[si],ax;转换后的数据保存到score2
movx,0
looprept1
movah,4ch
int21h
codeends
endstart
习题七
12功能:
两个字节数相加。
X和BL相加保存到Y。
13功能:
键盘输入的字符保存到KEY单元中,直到按回车为止。
14功能:
将X单元中的十六进制3AH变为十进制入栈保存,AH中为余数。
先将0008H入栈,再将0005H入栈,结果为58。
16
PUSHAXPUSHBXMOVBX,0LET1:
MOVAH,1INT21HCMPAL,0DH;输入回车退出JZEXITMOVBUFFER[BX],AL;保存到BUFFERINCBXJMPLET1EXIT:
POPBXPOPAXRETKEY_INENDP
17
KEY_IN_DECPROCPUSHAXPUSHBXMOVX,0MOVBX,0MOVSI,0LET1:
MOVAH,1INT21HCMPAL,0DH;输入回车退出JZEXITMOVBUFFER[SI],AL;保存到BUFFERINCSIJMPLET1EXIT:
MOVCX,SI;位数放在CXMOVSI,0LET2:
MOVAL,BUFFER[SI]SUBAL,30HMOVAH,