汇编语言课后答案重点讲义资料.docx
《汇编语言课后答案重点讲义资料.docx》由会员分享,可在线阅读,更多相关《汇编语言课后答案重点讲义资料.docx(27页珍藏版)》请在冰豆网上搜索。
汇编语言课后答案重点讲义资料
1-1
(1)
传统计算机:
①控制器;②运算器;③存储器;④输入设备;⑤输出设备。
现代计算机:
①处理器;②存储系统;③输入输出系统。
(2)直接控制硬件,易产生运行速度快,目标代码小的程序。
(3)处理器中数量多,使用频率改,多种用途的一组寄存器。
(4)后进先出。
(5)6个状态标志:
CF、AF、ZF、SF、PF、OF;3个控制标志位:
DF、IF、TF。
(6)左边最高位。
(7)无。
(8)字母大小写不同,但是表示同一个符号。
(9)不被汇编。
(10)源程序和目标代码,各种标识符的说明。
1-2
(1)√
(2)×,属于专用寄存器
(3)×,8个16位通用寄存器
(4)√
(5)×,不一样,原因见P25
(6)√
(7)×,4部分需要分隔符区别
(8)√
(9)×,程序终止代表程序执行结束,不意味汇编结束。
汇编是将源程序翻译成目标模块代码的过程,源程序的最后必须有一条END伪指令表明汇编结束,END指令之后的任何内容不被汇编程序处理。
(10)√
1-3
(1)1M=220BYTE
(2)8
(3)BX,CX,SI,DI,BP,SP
(4)16,DL,DH
(5)4,16
(6)低4位地址全为0,64KB
(7)段地址,偏移地址,IP
(8)目录
(9)操作码,地址码/操作数
(10).ASM,目标模块,.EXE
1-4
见P2
1-5
见P10
1-6
(1)0FFF0H
(2)417H
(3)24500H
(4)0BC777H
1-7
代码段:
主要存放程序中的指令代码。
数据段:
主要存放当前运行程序所用的数据。
堆栈段:
指明当前运行程序所使用的堆栈区域。
1-8
见P4-P5
1-9
见课件
1-10
见P25-P27
1-11
见P16或者课件
1-12
见P17或者课件
1-13
FFH,Again,next,h_asscii
1-14
见P27或者课件
2-1
(1)没有,因为8位字节表示的范围:
0~255
(2)没有,都是46H
(3)因为(34+67H)*3是常数
(4)以避免与不能以数字开头的标识符混淆
(5)不能,因为8位字节表示的范围:
0~255
(6)防止发生非法操作
(7)寻找操作数存储的地址
(8)有效地址直接包含在指令中
(9)DS
(10)不正确,因为类型不匹配
2-2
(1)√
(2)×,小写字母排在大写字母之后
(3)√
(4)×,不一样多
(5)√
(6)√
(7)×,没有对齐,因为0403H是奇数地址,不是偶数地址
(8)√
(9)√
(10)√
2-3
(1)97,61,a
(2)0DH,0AH
(3)DB,OFFSET
(4)8843H
(5)DWORD,4,WORDPTR
(6)3
(7)立即数寻址,寄存器寻址,存储器寻址
(8)寄存器寻址,立即数
(9)4028H
(10)DS,SS
2-4
(1)255
(2)0
(3)94
(4)239
2-5
(1)00010010B
(2)00100100B
(3)01101000B
(4)10011001B
2-6
(1)91
(2)89
(3)36
(4)90
2-7
(1)0B
(2)01111111B
(3)10000001B
(4)11000111B
2-8
(1)8A36H,CF=0
(2)4AE4H,CF=1
(3)0AE10H,CF=0
(4)0ECA9H,CF=1
2-9
数码0~9:
30H~39H
大写字母A~Z:
41H~5AH
小写字母a~z:
61H~7AH
0DH:
回车符CR,0AH:
换行符LF
2-10
Datasegment
my1bDB‘PersonalComputer’
my2bDB20
my3bDB14h
my4bDB00010100B
my5wDW20DUP(?
)
my6cEQU100
my7cEQU
Dataends
2-11
Datasegment
NUM=5
DATALISTDW-10,2,5,4,?
Dataends
2-122-13
-
movax,offsetmess
;AX=114H
movax,typebuff+typemess+typevard
;AX=1+1+4=6
movax,sizeofvarw+sizeofbuff+sizeofmess
;AX=2*2+10*1+5*1=19
movax,lengthofvarw+lengthofvard
;AX=2+1=3
-
-
-
-
-
0FFH
0FBH
o
118H
00H
l
117H
10H
l
116H
04H
e
115H
04H
mess
h
114H
04H
-
113H
-
-
112H
0FFH
-
111H
04H
-
110H
04H
-
10FH
04H
-
10EH
-
-
10DH
0FFH
-
10CH
04H
-
10BH
04H
buff
-
10AH
04H
12H
109H
-
34H
108H
0FFH
56H
107H
46H
vard
78H
106H
45H
04H
105H
10H
varb
03H
104H
0AH
56H
103H
43H
78H
102H
42H
12H
101H
41H
varw
34H
100H
2-14
略
2-15
varDD12345678H
12H
movbx,wordptrvar;BX=5678H
movcx,wordptrvar+2;CX=1234H
movdl,byteptrvar;DL=78H
movdh,byteptrvar+3;DH=12H
34H
56H
var
78H
2-16
P56图2-10和图2-11
2-17
(1)立即数寻址
(2)直接寻址
(3)寄存器寻址
(4)寄存器间接寻址
(5)寄存器相对
(6)寄存器相对寻址
(7)基址变址寻址
(8)相对基址变址寻址
3-1
(1)MOVSI,BYTEPTR250或者MOVAL,BYTEPTR250
(2)DX与CL类型不匹配
(3)堆栈的操作“后进先出”
(4)MOVBX,OFFSET[SI]汇编时并不知道指令在执行时SI等于什么,所以是错误的
(5)结果是0
(6)目的操作数
(7)大写=小写ANDDFH;D5位清0
小写=大写OR20H;D5位置1
大/小写=小/大写XOR20H;D5位求反
(8)利用CF和OF结果判断
(9)DX.AX
(10)逻辑与运算规则类似于二进制的乘法。
3-2
(1)×,因为MOV指令不影响标志位
(2)×,空操作指令NOP(=XCHGAX,AX)
(3)×,堆栈是利用主存实现的,MOVBX,[BP+4]也是对的
(4)√
(5)√
(6)×,ADD指令影响6个状态标志位,而INC指令不影响进位CF标志,影响其他状态标志位。
(7)×,有符号数进行符号扩展,位数加长一倍,数值不变
(8)×,CMP指令不保存结果
(9)×,NOT指令不影响标志位
(10)×,无符号数SHL指令左移一位,就是乘2
3-3
(1)减少(-2)
(2)DX,(SP)=(SP)+2
(3)78894111
(4)26H,PF=0,0BE26H,PF=0
(5)0FF68H,SF=1
(6)0FF98H
(7)0000H
(8)0,0,0
(9)01234678H
(10)CL,4
3-4
(1)MOVAX,100
(2)MOVBYTEPTRVAR,100
(3)MOVAX,BX
(4)MOVBYTEPTRVAR,AL
(5)MOVDS,AX
(6)MOVAX,WORDPTRVAR
(7)MOVDS,WORDPTRVAR
(8)MOVAX,DS
(9)MOVWORDPTRVAR,DS
3-5
(1)类型不匹配
(2)IP自动赋值
(3)段寄存器不能直接赋值
(4)段寄存器之间不能直接赋值
(5)类型不匹配
(6)目的操作数没有指明数据类型
(7)MOVAX,[BX+DI]
(8)MOV指令中目的操作数不能为立即数
3-6
MOVAX,BX
MOVBX,WORDPTR[DI]
MOVWORDPTR[DI],AX
3-7
后进先出的主存结构,入栈指令:
PUSH,出栈指令:
POP
3-8
SP=4302H
3-9
执行结果:
AL=12H
如果不用XLAT指令,则用MOVAL,BYTEPTR[BX+AL]指令替换XLAT指令
3-10
P75-76或者见课件
3-11
(1)
movax,80h;AX=80h
addax,3;AX=83h,CF=0,SF=0
addax,80h;AX=103h,CF=0,OF=0
adcax,3;AX=106h,CF=0,ZF=0
(2)
movax,100;AX=100
addax,200;AX=300,CF=0
(3)
movax,100;AX=100
addal,200;AX=002Ch,CF=1注:
100+200=64h+0C8h=[1]2Ch
(4)
moval,7fh;AL=7fh
subal,8;AL=77h,CF=0,SF=0
subal,80h;AL=0f7h,CF=1,SF=1
sbbal,3;AL=0f3h,CF=0,SF=0
3-12
指令
AL
CF
ZF
SF
OF
PF
moval,89h
89h
不变
不变
不变
不变
不变
addal,al
12h
1
0
0
1
1
addal,9dh
0afh
0
0
1
0
1
cmpal,0bch(不保存结果)
0afh
1
0
1
0
1
subal,al
00h
0
1
0
0
1
decal(不影响CF)
0ffh
0
0
1
0
1
incal(不影响CF)
00h
0
1
0
0
1
3-13
(1)DX=11H,AX=0F00H
(2)DX=00FFH,AX=0E000H
3-14
(1)ADDDX,BX
(2)ADDAL,BYTEPTR[BX+SI]
(3)ADDWORDPTR[BX+0B2H],CX
(4)ADDWORDPTRVAR,3421H
(5)ADDAX,0A0H
3-15
;数据段
buffer1DD12345678h
buffer2DD56781234h
;代码段
MOVAX,WORDPTRbuffer1
MOVDX,WORDPTRbuffer1+2
SUBAX,WORDPTRbuffer2
SBBDX,WORDPTRbuffer2+2
3-16
(1)
movsi,10011100b;SI=9Ch
andsi,80h;SI=80h
orsi,7fh;SI=0FFh
xorsi,0feh;SI=01h
(2)
movax,1010b;AX=00001010B
movcl,2
shrax,cl;AX=00000010B,CF=1
shrax,1;AX=00000100B,CF=0
andax,3;AX=00000000B,CF=0
(3)
movax,1011b;AX=00001011B
movcl,2
rolax,cl;AX=00101100B,CF=0
rolax,1;AX=00010110B,CF=0
orax,3;AX=00010111B,CF=0
(4)
xorax,ax;AX=0,CF=0,OF=0,ZF=1,SF=0,PF=1
3-17
指令
AX
CF
OF
SF
ZF
PF
movax,1470h
1470h
不变
不变
不变
不变
不变
andax,ax
1470h
0
0
0
0
0
orax,ax
1470h
0
0
0
0
0
xorax,ax
0000h
0
0
0
1
1
notax(不影响标志位)
0ffffh
0
0
0
1
1
testax,0f0f0h(不保存结果)
0ffffh
0
0
1
0
1
3-18
AND复位某些位(同0与),不影响其他(同1与)
OR置位某些位(同1或),不影响其他(同0或)
XOR求反某些位(同1异或),不影响其他(同0异或)
andbl,11110110b;BL中D0和D3清0,其余位不变
orbl,00001001b;BL中D0和D3置1,其余位不变
xorbl,00001001b;BL中D0和D3求反,其余位不变
3-19
;数据段
bcddb92h
asciidb?
?
;代码段
moval,bcd
andal,0fh
oral,30h
movascii,al
movah,bcd
movcl,4
shrah,cl
orah,30h
movascii+1,ah
3-20
运算公式:
(VAR1*VAR2+VAR3-540)/VAR4
运算结果:
商存放在AX中,余数存放在DX中
3-21
X=7
等效乘法指令如下:
MOVX,7
IMULX
3-22
MOVSI,AX
MOVCL,4
SHLSI,CL
MOVBX,AX
SHLBX,1
SHLBX,1
ADDAX,SI
ADDAX,BX
3-23
;数据段
numdb6,7,7,8,3,0,0,0;被转换数字
tabdb'67783000';代码表
;代码段
movcx,lengthofnum;CX=8
movsi,offsetnum;SI=num的偏移地址,指向被转换的地址表
movdi,offsettab;DI=tab的偏移地址,指向代码表
again:
movdl,[si];DL=被转换的数字
xchgdl,[di];DL=转换的代码
mov[si],dl;转换后的代码置于被转换数字的地址中
movah,2
int21h;显示DL中的字符=转换的代码
incsi;指向下一个被转换数字的地址
incdi;指向下一个代码的地址
loopagain;循环
运行结果:
显示6783000
替换寄存器相对寻址,其代码如下:
;数据段
numdb6,7,7,8,3,0,0,0;被转换数字
tabdb'67783000';代码表
;代码段
movcx,lengthofnum;CX=8
movsi,0;初始化num的偏移首地址
movdi,0;初始化tab的偏移首地址
again:
movdl,num[si];DL=被转换的数字
xchgdl,tab[di];DL=转换的代码
movnum[si],dl;转换后的代码置于被转换数字的地址中
movah,2
int21h;显示DL中的字符=转换的代码
incsi;指向下一个被转换数字的地址
incdi;指向下一个代码的地址
loopagain;循环
3-24
运行结果:
大写字母转换为小写字母,显示welldone
修改成BX寄存器相对寻址,其代码如下:
;数据段
msgdb'WELCOME','$'
;代码段
movcx,(lengthofmsg)-1
xorbx,bx
again:
moval,msg[bx]
addal,20h
movmsg[bx],al
incbx
loopagain
movdx,offsetmsg
movah,9
int21h
3-25
movarray2[bx],ax
addbx,2
4-4
MOVAX,var1
MOVBX,6
MULBX;(DX,AX)←var1*6
MOVBX,var2
SUBBX,7;BX←var2-7
DIVBX;AX←(var1*6)/(var2-7)
ADDAX,var3;AX←(var1*6)/(var2-7)+var3
MOVvar4,AX;var4←(var1*6)/(var2-7)+var3
随堂测试
设x,y,z,v均为16位带符号数,分别装在X,Y,Z,V存储单元中,编写指令代码段,实现(v-(x*y+z-540))/x运算公式,商存储在W存储单元中,余数在W+2存储单元中。
答案:
MOVAX,X
IMULY;(DX,AX)←x*y
MOVCX,AX
MOVBX,DX;(BX,CX)←x*y
MOVAX,Z
CWD;(DX,AX)←z扩展成32位
ADDCX,AX
ADCBX,DX;(BX,CX)←x*y+z
SUBCX,540
SBBBX,0;(BX,CX)←x*y+z-540
MOVAX,V
CWD;(DX,AX)←v扩展成32位
SUBAX,CX
SBBDX,BX;(DX,AX)←v-(x*y+z-540)
IDIVX;v-(x*y+z-540),AX←商,DX←余数
MOVW,AX;W←商
MOVW+2,DX;W+2←余数
4-10
(1)CMPDX,DI
JAabove
(2)CMPBX,SI
JGgreater
(3)CMPBX,0
JEzero
(4)CMPBX,SI
JOoverflow
(5)CMPSI,BX
JLEless_eq
(6)CMPDI,DX
JBEbelow_eq
4-13
思路:
(1)BX←AX,BX逻辑左移1位,将AX的符号位移入CF;
(2)RCLDX,1将AX的符号位移入DX;
(3)重复
(1)~
(2)16次。
MOVCX,16
again:
MOVBX,AX
SHLBX,1
RCLDX,1
LOOPagain
或者3.20题目思想:
MOVDX,AX
MOVCL,15
SARDX,CL
4-18
思路同4-13:
MOVCX,3
again:
SHLAX,1
RCLDX,1
LOOPagain
4-15编程:
先提示输入数字“InputNumber:
0~9”,然后在下一行显示输入的数字,结束;如果不是键入了0~9数字,就提示错误“Error!
”,继续等待输入数字。
DATASEGMENT
inputstringdb'InputNumber:
0~9',13,10,'$'
errorstringdb'Error!
',13,10,'$'
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETinputstring
MOVAH,09H
INT21H
INPUT:
MOVAH,07H;键盘输入字符到AL,无回显
INT21H
CMPAL,'0';小于0,转移,显示'Error!
'
JBERROR
CMPAL,'9';大于9,转移,显示'Error!
'
JAERROR
MOVDL,AL;0~9数字,回显/输出到屏幕
MOVAH,02H
INT21H
JMPEXIT
ERROR:
MOVDX,OFFSETerrorstring;输出'Erro
MOVAH,09H
INT21H
JMPINPUT
EXIT:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
4-26以MOV指令为例,说明串操作指令的寻址特点,并用MOV和ADD等指令实现MOVSW的功能(假设DF=0)。
DATASEGMENT
srcmsgDB'srcstring=','$'
srcstringDB'helloeverybody!
'
srcendDB'$'
stringlengthEQU(lengthofsrcstring)/2
dstmsgDB'dststring=','$'
dststringDBstringlengthdup(?
),'$'
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVDX,OFFSETsrcmsg
MOVAH,09H
INT21H
MOVDX,OFFSETsrcstring
MOVAH,09H
INT21H
MOVCX,stringlength
MOVBX,0
CLD
AGAIN:
MOVAX,WORDPTRsrcstring[BX]
MOVWORDPTRdst