汇编语言程序设计第二版课后题答案.docx
- 文档编号:8702844
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:24
- 大小:28.60KB
汇编语言程序设计第二版课后题答案.docx
《汇编语言程序设计第二版课后题答案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计第二版课后题答案.docx(24页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计第二版课后题答案
4.1、判断下列标识符的合法性。
1)、code合法
2)、Data合法
3)、ABCDH合法
4)、1abcH不
5)、eax不
6)、?
?
?
01合法
7)、A?
@合法
8)、www@zsu合法
9)、不
10)、AX$DX合法
11)、_BX合法
12)、CX不
4.2、按下面要求写出相应的数据定义语句(未指定变量名的,可任意指定或省缺)。
1)、定义一个字节区域,第一个字节的值为20,其后跟20个初值为0的连续字节;
DB20,20DUP(0)
2)、定义一个以0为结束符的字符串,其初值为:
Thecourseiseasy;
DB“Thecourseiseasy”,0
3)、定义一个以'$'为结束符的字符串,该串中含有换行符和回车符;
DB0D,0A,”$”
4)、定义100个字,其初值为0;
DW100DUP(0)
5)、从一个偶地址开始定义一个字变量word;
EVEN
WORDDW?
6)、先定义一个字符串String,其偏移量指定为10,其初值为"ABCDEF",然后再定义3个字类型的数组Data,要求String和Data的偏移量相同;
ORG10
STRINGDB"ABCDEF"
ORG10
DATADW3DUP(?
)
7)、定义一个字符串String,其初值为"12345678",再定义4个字类型的数组Data,要求String和Data共享同一片内存单元;
STRINGDB"12345678"
ORG$-8
DATADW4DUP(?
)
4.3、把下列C语言的变量定义语句改写成与之等价的汇编语言语句。
1)、charch1,ch2[3],ch3[]="Areyouready?
",ch4='Q';
CH1DB?
CH2DB3DUP(?
)
CH3DB"Areyouready?
",0
CH4DB“Q”
2)、intw1,w2[5],w3=0x1234,w4[]={90,89,432,344};
W1DW?
W2DW5DUP(?
)
W3DW1234H
W4DW90,89,432,344
3)、longintd1=1234,d2,d3[10],d4[]={1,2,3,4,5,6};
D1DD1234
D2DD?
D3DD10DUP(?
)
D3DD1,2,3,4,5,6
4.4、假设4.3题中三组变量在内存中是连续存放的,且变量ch1的偏移量是20H,试求出其它每个变量的偏移量。
变量
偏移量
变量
偏移量
变量
偏移量
Ch1
20H
W1
34H
D1
4AH
Ch2
21H
W2
36H
D2
4EH
Ch3
24H
W3
40H
D3
52H
Ch4
33H
W4
42H
D4
7AH
4.5、按下列要求分别写出汇编语言的结构定义,如果没有说明结构分量的类型,请根据日常习惯自行指定其数据类型(可使用已有的结构定义)。
1)、定义日期结构类型Date,其包括:
Year(年)、Month(月)和Day(日);
DATASTRUC偏移量
YEARDB?
0
MONTHDB?
1
DAYDB?
2
DATAENDS
2)、定义时间结构类型Time,其包括:
Hour(小时)、Minute(分)、Second(秒)和centsec(百分之一秒);
TIMESTRUC
HOURDB?
0
MINUTEDB?
1
SECONDDB?
2
CENTSECDB?
3
TIMEENDS
3)、定义结构Peason,其包括:
name(姓名,字符,长度为8)、Birth(出生日期,Date),stature(身高,以厘米为单位的整数),Address(地址,30个字符)
PERSONSTRUC
NAMEDB8DUP(?
)0
BIRTHDATA<>8
STATUREDB?
0BH
ADDRESSDB30DUP(?
)0CH
PERSONENDS
4.6、试求出4.5题各结构中字段的偏移量。
4.7、把下列C语言的结构或结构变量的定义改写为与之等价的汇编语言定义语句。
1)、structScreenBuffer{
char c1; //字符
char attr; //字符属性
}Buffer[2000];
ScreenBufferstruc
C1DB?
ATTRDB?
ScreenBufferENDS
BUFFERScreenBuffer2000DUP(<>)
2)、structFILE{
int level,flags;
char fd,hold;
int bsize,istemp,token;
};
3)、structCELLREC{
char attrib;
union{char text[201];
long value;
struct{long fvalue;
char formula[201];
}f;
}v;
};
答:
STRUC_FSTRUC
FVALUEDD?
FORMULADB201DUP(?
)
STRUC_FENDS
UNION_VUNION
TEXTDB201DUP(?
)
VALUEDD?
FSTRUC_F<>
UNION_VENDS
CELLRECSTRUC
ATTRIBDB?
VUNION_V<>
CELLRECENDS
4.8、按下列要求分别写出汇编语言的记录定义。
1)、定义标志位寄存器低8位标志位,其相应位用其标志位的符号来命名,未用部分的命名自行确定;
FLAGSRECORDSF:
1,ZF:
1,EMPTY1:
1,EMPTY2:
1,PF:
1,EMPTY3:
1,CF:
1
2)、定义一个压缩型的BCD码类型;
3)、把一个字节分成三部分:
0~2位、3~5位和6~7位,每部分可独立存取,它们的初值分别为4,5和2;
4)、把一个字分割成:
0~1位、2~6位、7~12位,其中第一部分的初值位3,第三部分的初值为25。
4.9、试求出4.8题各记录中字段的宽度和屏蔽属性值。
4.10、假设变量B1的偏移量为12H,试求出它们的属性OFFSET、TYPE、LENGTH和SIZE的值。
B1 DB "Theprogramminglanguageiseasy",0
W1 DW 10DUP(1,2),1234
D1 DD 20DUP(0),
P1 PEASON <>,<> ;结构PEASON的定义见4.4.2
U1 UNION1 3DUP(<>) ;联合UNION1的定义见4.4.3
OFFSET
TYPE
LENGTH
SIZE
B1
12H
1
1
1
W1
33H
2
10
20
D1
5DH
4
20
80
P1
0ADH
15
1
15
U1
0CBH
2
3
6
4.11、试用三种方法定义字节变量(或字段名)B1和字变量(或字段名)W1,它们共享20个存储单元。
1.U1UNION
B1DB20DUP(?
)
W1DW10DUP(?
)
U1ENDS
2.W1EQUTHISWORD
B1DB20DUP(?
)
3.B1DB20DUP(?
)
ORG$-20
W1DW10DUP(?
)
4.12、强制属性操作符会改变变量的定义属性吗?
在C语言中存在类似功能的语句吗?
若存在,请举例说明。
4.13、假设有题4.10题中的变量定义,试写出符合要求的地址表达式。
1)、取从B1开始的字母'p'和第一个'm';
[b1+4],[b1+10]
2)、访问从W1开始的第3个字单元(从序数1开始计数,第1、第2、……)的值为2的存储单元;
[w1+10]
3)、访问从D1开始的第10个双字单元;
[d1+36]
4)、访问从P1开始的第2个结构中的字段NO;
[p1+15]
5)、访问从U1开始的第3个联合中的字段WW;
[u1+4]
4.14、把下列C语言程序中的说明性语句改写成等价的汇编语言语句。
#define N 200
structbuffer{
char len1,len2,buff[N];
}buff;
intData[N];
NEQU200
BUFFERSTRUCT
LEN1DB?
LEN2DB?
BUFFDBNDUP(?
)
BUFFERENDS
BUFFBUFFER<>
DATADWNDUP(?
)
4.15、简述数值表达式与地址表达式的主要区别。
4.16、计算下列各数值表达式的值。
1)、12HAND78H
0010H
2)、1234MOD3+23H
0024H
3)、5467HXOR12FFH
4698H
4)、'A'OR20H
0061H
5)、10LT9
0
6)、4567/13+10H
016FH
7)、1234H+89HSHL1
1346H
8)、8910HSHR2AND506H
0004H
5.3习题
5.1、书写正确的MOV指令,需要符合哪些规定?
在32位CPU中,增加了什么指令来克服不同数据类型之间的数据传送?
5.2、简述指令MOVBX,1234H、MOVBX,[1234]和MOVBX,offset[1234H]的功能和它们之间区别。
MOVBX,1234H将通用寄存器BX的当前值设为1234H
MOVBX,[1234]取出内存地址1234H的当前值赋予通用寄存器BX
MOVBX,offset[1234H]取出内存地址1234H的偏移量,而地址【1234H】的偏移量就是1234H
5.3、简述指令MOVBX,Data和MOVBX,offsetData之间的区别。
MOVBX,Data将DATA的值赋予通用寄存器BX
MOVBX,offsetData将data的偏移地址赋予通用寄存器BX
5.4、选择指令实现下列要求,OPN1←OPN2的含义:
把操作数OPN2的值传送给OPN1。
1)、EBX←EDX
MOVEBX,EDX
2)、BX←CLMOVSXBX,CL
3)、SI←BX
4)、DS←AX
5)、AL←BH
6)、AL←12H
7)、AX←13AH
8)、CX←0CDH
9)、SI←1000H
(假设0CDH为无符号数)
10)、EBX←1200A2H
5.5、PUSHA指令能把哪些寄存器压栈?
它们进栈的顺序是什么?
可用什么指令把这些寄存器依次弹出堆栈?
POPA
5.6、PUSHAD指令完成什么操作?
它与什么操作的作用相反?
5.7、在16位/32位CPU中,标志位寄存器的内容进栈和出栈的指令是什么?
5.8、写出下列指令序列中每条指令的执行结果,请在Debug环境下验证之,并注意各标志位的变化情况。
MOV BX,23ABH
ADD BL,0ACH
MOV AX,23F5H
ADD BH,AL
SBB BX,AX
ADC AX,12H
SUB BH,-9
5.9、假定DS=1123H,SS=1400H,BX=0200H,BP=1050H,DI=0400H,SI=0500H,LIST的偏移量为250H,试确定下面各指令访问内存单元的地址。
1)、MOVAL,[1234H]
1234H
2)、MOVAX,[BX]
0200H
3)、MOV[DI],AL
0400H
4)、MOV[2000H],AL
2000H
5)、MOVAL,[BP+DI]
1450H
6)、MOVCX,[DI]
0400H
7)、MOVEDX,[BP]
1050H
8)、MOVLIST[SI],EDX
0750H
9)、MOVCL,LIST[BX+SI]
0950H
10)、MOVCH,[BX+SI]
0700H
11)、MOVEAX,[BP+200H]
1250H
12)、MOVAL,[BP+SI+200H]
1750H
13)、MOVAL,[SI-0100H]
0400H
14)、MOVBX,[BX+4]
0204H
5.10、用一条指令实现把BX和SI之和传送给CX。
CX,[BX+SI]
LEACX,[BX+SI]
5.11、试比较下列三组指令的功能。
1)、LDSSI,[DI]
相当于MOVSI,[DI]
MOVDS,[DI+2]
2)、MOVSI,[DI] 3)、MOVDS,[DI+2]改变了DS的值,因此随后执行
MOVDS,[DI+2]
MOVSI,[DI]
功能与1同
5.12、标志位CF有着重要的作用,请简述之,并至少写出三种把CF置0的方法。
CLC
XORAX,AX
SUBAX,AX
5.13、写一个计算DL三次方的指令序列,假设幂不超过16位二进制。
MOVAL,DL
MULDL;(AX)乘积
MOVBX,AX
MOVAL,DL
CBW;(AX)扩展值
MULBX
计算结果放在AX中
5.14、写出一个指令序列实现:
用CL中数据除BL中的数据,然后商乘2,最后的结果存入DX中。
MOVAL,BL
CBW;(AX)
DIVCL;商(AL)
CBW
SHLAX,1
MOVDX,AX
5.15、按下列要求编写指令序列。
1)、清除DH中的最低三位而不改变其它位,结果存入BH中;
ANDDH,0F8H
MOVBH,DH
2)、把DI中的最高5位置1而不改变其它位;
ORDI,0F800H
3)、把AX中的0~3位置1,7~9位取反,13~15位置0;
ORAX,000FH
XORAX,0380H
ANDAX,1FFFH
4)、检查BX中的第2、5和9位中是否有一位为1;
ANDBX,0224H;如BX!
=0,则至少1位为1
5)、检查CX中的第1、6和11位中是否同时为1;
ANDCX,0842H
XORCX,0842H
6)、检查AX中的第0、2、9和13位中是否有一位为0;
ORAX,0DDFA
如AX!
=0FFFFH则至少一位为0
7)、检查DX中的第1、4、11和14位中是否同时为0;
ANDDX,4812H
如果DX为0,说明同时为0
5.16、简述指令AND和TEST、NOT和NEG之间的区别。
5.17、选择适当的指令实现下列功能。
1)、右移DI三位,并把零移入最高位;
MOVCL,3
SHRDI,CL
2)、把AL左移一位,使0移入最低一位;
SHLAL,1
3)、AL循环左移三位;
MOVCL,3
ROLAL,CL
4)、EDX带进位位循环右移四位;
RCREDX,4
5)、DX右移六位,且移位前后的正负性质不变。
SARDX,CL
5.18、判断下列指令的正确性,若某指令是错误的,请说明其错误原因。
1)、MOVBL,CX
2)、MOVDS,SS
3)、MOV[BX],[DI]
4)、MOVAL,[BX][SI]
5)、MOVES,AL
6)、MOVDS,DX
7)、MOVCS,AX
8)、MOVBX,CS
9)、MOVDS,1230H
10)、MOVSXDS,AL
11)、XCHGBX,3
12)、POPCS
13)、MOVIP,SI
14)、PUSHCS
15)、PUSHBL
16)、MOV[SP],BX
17)、MOVAX,BX+3
18)、MOVAX,[BX+3]
19)、MOVBX,[BX]
20)、MOVBH,[BL]
21)、XCHGES,AX
22)、LEAAX,[BX+SI]
23)、MUL10H
24)、IMULDX,10H
25)、DIV10
26)、IDIVDX,10H
27)、SHLAX,CX
28)、SHRBX,CH
29)、ROLBX,20
30)、RCRAX,CL
31)、CMPAX,1234H
32)、CMP12H,CL
33)、JCXZnext
34)、JEBXZnext (假设标号next已存在)
5.19、方向标志DF的作用是什么?
用于设置或消除该标志位的指令是什么?
5.20、串指令用DI和SI寻址哪些内存段中的内存数据?
串操作指令用DI寻址ES段的内存数据,用SI寻址DS段的内存数据
5.21、段间转移和段内转移之间的区别是什么?
5.22、SCASB指令的作用是什么?
叙述指令REPESCASB指令所完成的功能。
5.23、指令REPNESCASB结束执行的条件是什么?
5.24、REP前缀的作用是什么?
能用指令REPLODSB读取DS:
SI所指内存中的每个字符来进行处理吗?
若不能,请说明原因。
5.25、编写指令序列,在字符串LIST中查寻字符'B',若找到,则转向Found,否则,转向NotFound,假设该字符串含有300个字符。
CLD
MOVAX,SEGLIST
MOVES,AX
LEADI,LIST
MOVCX,300
MOVAL,42H
REPNZSCASB
JZFOUND
JMPNOTFOUND
5.26、编写指令序列,把Source存储区域中的12个字节传送到Dest存储区域内。
CLD
MOVAX,SEGSOURCE
MOVDS,AX
LEASI,SOURCE
MOVAX,SEGDEST
MOVES,AX
LEADI,DEST
MOVCX,12
REPMOVSB
5.27、设计一个短指令序列,将32位数AX:
BX中的8位BCD与CX:
DX中的8位BCD相加,并把所得结果存入CX:
DX中。
1.PUSHAX
2.MOVAX,BX
3.ADDAL,DL
4.DAA
5.MOVDL,AL
6.MOVAL,BH
7.ADCAL,DH
8.DAA
9.MOVDH,AL
10.POPAX
11.ADCAL,CL
12.DAA
13.MOVCL,AL
14.MOVAL,AH
15.ADCAL,CH
16.DAA
17.MOVCH,AL
5.28、有符号数比较后,用什么样的条件转移指令实现转移?
无符号数比较后,用什么样的条件转移指令实现转移?
6.6习题
6.1、简述ASSUME伪指令的作用,用该语句说明的段寄存器不用对其赋段地址的初值?
6.2、用二种定义方法堆栈段,并给出相应的初始化语句或说明。
6.3、把下列C语句的语句改写成功能相同的汇编语言程序片段(其中:
变量都为整型变量)。
1)、h=(key&0XFF00)>>8;
KEYDW?
HDW?
MOVAX,KEY
ANDAX,0FF00H
MOVCL,8
SARAX,CL
MOVH,AX
2)、k=(k+'1'–0xabcd)/56;
KDW?
MOVAX,K
ADDAX,0031H
SUBAX,0ABCDH
CWD
MOVBX,56
IDIVBX
MOVK,AX
3)、for(i=s=0;i<100;i++)s+=data[i]*2;
IDW?
SDW?
DATADW100DUP(?
)
MOVS,0
MOVI,0
MOVSI,I
MOVBX,I
MOVAX,S
NEXT1:
CMPSI,100
JGENEXT2
MOVBX,DATA[BX]
SALBX,1
ADDAX,BX
INCSI
ADDBX,2
JMPNEXT1
NEXT2:
MOVS,AX
4)、for(s=0,i=100;i>0;i--)s+=i*2;
6.4、把下列C语言的语句改写成等价的汇编语言程序段(不考虑运算过程中的溢出)。
If(a<1||b/4>10&&c%8==5){
a=20+b++;
c<<=2;
}
else{a=21-(++c);
b--;
}
其中:
变量a、b和c都是有符号的整型(int)变量。
ADW?
BDW?
CDW?
…
MOVBX,B
MOVCL,2
SARBX,CL
MOVCX,C
ANDCX,0007H
CMPBX,10
JBENEXT1
CMPCX,5
JNENEXT1
NEXT2:
MOVBX,B
MOVAX,20
ADDAX,BX
MOVA,AX
INCBX
MOVB,BX
MOVCX,C
SALCX,1
SALCX,1
MOVC,CX
JMPNEXT3
NEXT1:
MOVAX,A
CMPAX,1
JBNEXT2
MOVCX,C
INCCX
MOVC,CX
MOVAX,21
SUBAX,CX
MOVA,AX
MOVBX,B
DECBX
MOVB,BX
NEXT3:
6.5、假设内存单元中有三个字a、b和c,编写一个程序,它可判断它们能否构成一个三角形,若能,CF为1,否则,CF为0。
判断三边是否能构成一个三角形的原则是:
任意一边的变长都不得大于另外两边的边长之和。
对应c语言语句如下:
IF((A+B)>C&&(A+C)>B&&(B+C)>A){
//能构成三角形
}
ELSE{
//不能构成三角形
}
6.6、假设有三个无符号字存放在以Buffer为开始的缓冲区中,编写一个程序把它们从低到高排序好。
BUFFERDW3DUP(?
)
MOVAX,BUFFER
MOVBX,BUFFER[2]
MOVCX,BUFFER[4]
CMPAX,BX
JBENEXT1
XCHGAX,BX
NEXT1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 第二 课后 答案