1632位微机原理汇编语言及接口技术钱晓捷第2版课后习题答案.docx
《1632位微机原理汇编语言及接口技术钱晓捷第2版课后习题答案.docx》由会员分享,可在线阅读,更多相关《1632位微机原理汇编语言及接口技术钱晓捷第2版课后习题答案.docx(67页珍藏版)》请在冰豆网上搜索。
![1632位微机原理汇编语言及接口技术钱晓捷第2版课后习题答案.docx](https://file1.bdocx.com/fileroot1/2023-5/18/25ef7a6a-2afc-48f0-86bd-061cced6940f/25ef7a6a-2afc-48f0-86bd-061cced6940f1.gif)
1632位微机原理汇编语言及接口技术钱晓捷第2版课后习题答案
第一章
1.1解:
五代,详细见书
1.2解:
微型计算机:
以大规模、超大规模集成电路为主要部件,以集成了计算机主要部件——控制器和运算器的微处理器为核心,所构造出的计算机系统。
PC机:
PC(PersonalComputer)机就是面向个人单独使用的一类微机。
单片机:
用于控制的微处理器芯片,内部除CPU外还集成了计算机的其他一些主要部件,如:
ROM、RAM、定时器、并行接口、串行接口,有的芯片还集成了A/D、D/A转换电路等。
数字信号处理器DSP:
主要面向大流量数字信号的实时处理,在宿主系统中充当数据处理中心,在网络通信、多媒体应用等领域正得到越来越多的应用
1.3解:
微机主要有存储器、I/O设备和I/O接口、CPU、系统总线、操作系统和应用软件组成,各部分功能如下:
CPU:
统一协调和控制系统中的各个部件
系统总线:
传送信息
存储器:
存放程序和数据
I/O设备:
实现微机的输入输出功能
I/O接口:
I/O设备与CPU的桥梁
操作系统:
管理系统所有的软硬件资源
1.4解:
系统总线:
传递信息的一组公用导线,CPU通过它们与存储器和I/O设备进行信息交换。
好处:
组态灵活、扩展方便
三组信号线:
数据总线、地址总线和控制总线。
其使用特点是:
在某一时刻,只能由一个总线主控设备来控制系统总线,只能有一个发送者向总线发送信号;但可以有多个设备从总线上同时获得信号。
1.5解:
(1)用于数值计算、数据处理及信息管理方向。
采用通用微机,要求有较快的工作速度、较高的运算精度、较大的内存容量和较完备的输入输出设备,为用户提供方便友好的操作界面和简便快捷的维护、扩充手段。
(2)用于过程控制及嵌人应用方向。
采用控制类微机,要求能抵抗各种干扰、适应现场的恶劣环境、确保长时间稳定地工作,要求其实时性要好、强调其体积要小、便携式应用强调其省电。
1.6解:
1.7解:
I/O通道:
位于CPU和设备控制器之间,其目的是承担一些原来由CPU处理的I/O任务,从而把CPU从繁杂的I/O任务中解脱出来。
由10根信号线组成(A9-A0)。
1.8解:
BIOS:
基本输入输出系统。
主要功能:
用来驱动和管理诸如键盘、显示器、打印机、磁盘、时钟、串行通信接口等基本的输入输出设备
1.9解:
基本RAM区:
640KB
保留RAM区:
128KB
扩展ROM区:
128KB
基本ROM区:
128KB
1.10解:
(1)、数—用来直接表征量的大小,包括:
定点数、浮点数。
(2)、码—用来指代某个事物或事物的某种状态属性,包括:
二进制、八进制、十进制、十六进制。
区别:
使用场合不同,详见P16.
1.11解:
(1)
(2)
(3)
1.12解:
原码反码补码
+3700100101/25H00100101/25H00100101/25H
-3710100101/A5H11011010/DAH11011011/DBH
1.13解:
+37
-37
16位
32位
16位
32位
0025H
00000025H
FF5BH
FFFFFF5BH
1.14解:
无符号数:
70D
补码有符号数:
70D
BCD码:
46D
ASCII:
F
1.15解:
1)、相加后若出现和大于9,则将和减去10后再向高位进1
2)、若出现组间进位,则将低位加6
1.16解:
详见课本16页。
1.17解:
C3402000
1.18解:
50
50H
十进制值
50
80
二进制
十六进制
二进制
十六进制
00110010B
32H
01010000B
50H
1.19解:
D:
44H
d:
64H
CR:
0DH
LF:
0AH
0:
30H
SP:
20H
NUL:
00H
1.20解:
国标码:
3650H
机内码:
B6B0H
第二章
2.1
算术逻辑单元ALU、寄存器组和控制器;
总线接口单元BIU:
管理8088与系统总线的接口负责cpu对接口和外设进行访问
执行单元EU:
负责指令译码、执行和数据运算;
8位cpu在指令译码前必须等待取指令操作的完成,8088中需要译码的指令已经取到了指令队列,不需要等待取指令。
而取指令是cpu最为频繁的操作,因此8088的结构和操作方式节省了大量等待时间,比8位cpu节省了时间,提高了性能。
2.2
8个8位寄存器:
AH、AL、BH、BL、CH、CL、DH、DL;
8个16位寄存器:
累加器AX、基址寄存器BX、计数器CX、数据寄存器DX、源地址寄存器SI、目的地址寄存器DI、基址指针BP、堆栈指针SP。
2.3
标志用于反映指令执行结果或者控制指令执行形式。
状态标志用于记录程序运行结果的状态信息;控制标志用于控制指令执行的形式。
2.4
例:
有运算:
3AH+7CH=B6H
作为无符号数运算,没有进位,CF=0;
作为有符号数运算,结果超出范围,OF=1.
2.5
8088中每个存储单元有唯一的20位地址,称为物理地址。
处理器通过总线存取存储器数据时,采用这个物理地址。
在用户编程过程中采用的“段地址:
偏移地址”的形式称为逻辑地址。
将逻辑地址中的段地址左移4位,加上偏移地址就得到物理地址。
1MB最多能分成65536个逻辑段。
2.6
代码段:
存放程序的指令序列;
堆栈段:
确定堆栈所在的主存储区;
数据段:
存放当前运行程序的数据;
附加段:
附加数据段,用于数据保存。
另外串操作指令将其作为目的操作数的存放区。
2.7
8088的存储空间分段管理,程序设计时采用逻辑地址。
由于段地址在默认的或指定的段寄存器中,所以只需要偏移地址,称为有效地址EA.
操作数在主存中有以下几种寻址方式:
直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址。
2.8
(1)立即数寻址ax:
1200H
(2)寄存器寻址ax:
0100H
(3)存储器直接寻址ax:
4C2AH
(4)寄存器间接寻址ax:
3412H
(5)寄存器间接寻址ax:
4C2AH
(6)基址变址寻址ax:
7856H
(7)相对基址变址寻址ax:
65B7H
2.9
(1)cx为字寄存器,dl为字节寄存器,类型不匹配。
(2)mov指令的目的操作数只能是寄存器或者主存单元,ip是指针。
(3)不允许立即数到段寄存器的传送。
(4)不允许段寄存器之间的直接传送。
(5)数据溢出。
(6)sp不能用于寄存器间接寻址。
(7)格式不对。
应为:
movax,[bx+di]
(8)mov指令的操作数不能是立即数。
2.10
(1)bx得到table的偏移地址,bx=200H.
(2)将立即数8送到al。
(3)换码,al=12H.
2.11
(1)al=89H
(2)al=12H,cf=1,zf=0,sf=0,of=1,pf=1
(3)al=0AFH,cf=0,zf=0,sf=1,of=0,pf=1
(4)al=0AFH,cf=1,zf=0,sf=1,of=1,pf=1
(5)al=0,cf=0,zf=1,sf=0,of=0,pf=1
(6)al=0FFH,cf=0,zf=0,sf=1,of=0,pf=1
(7)al=0,cf=0,zf=1,sf=0,of=0,pf=1
2.12
(1)adddx,bx
(2)addal,[bx+si]
(3)addwordptr[bx+0B2H],cx
(4)addwordptr[0520H],3412H
(5)addal,0A0H
2.13
运算公式:
。
商存储在ax,余数存储在dx。
2.14
(1)ax=1470H
(2)ax=1470H,cf=0,of=0,sf=0,zf=0,pf=0
(3)ax=1470H,cf=0,of=0,sf=0,zf=0,pf=0
(4)ax=0,cf=0,of=0,sf=0,zf=1,pf=1
(5)ax=0FFFFH,cf=0,of=0,sf=0,zf=1,pf=1
(6)ax=0FFFFH,cf=0,of=0,sf=1,zf=0,pf=1
2.15
相对寻址方式、直接寻址方式、间接寻址方式。
2.16
(1)1256H
(2)3280H
2.17
(1)ax=1E1EH
(2)al的D0、D7位不全为0
(3)cx<64H
2.18
执行65536次。
2.19
功能:
将数组中每个字元素相加,结果存储于total。
2.20
(1)leasi,string
Movdh,[si]
Movdl,[si+5]
(2)movaxwordptrbuffer1
Subaxwordptrbuffer2
Movdxwordptrbuffer1+2
Sbbdxwordptrbuffer2+2
(3)testdx,0F000H
jzeven
even:
movax,0
(4)movcx,4
again:
sardx,1
rcrax,1
loopagain
(5)movcx,100
movsi,0
again:
moval,0FFH
addal,array[si]
movarray[si],al
incsi
loopagain
2.21
Htoascproc
Movbl,al
Moval,ah
Movbh,10
Mulbh
Andax,00FFH
Addal,bl
Htoend:
ret
Htoascendp
2.22
计算机系统利用中断为用户提供硬件设备驱动程序。
在IBM-PC系列微机中,基本输入输出系统ROM-BIOS和DOS都提供了丰富的中断服务程序,称为系统功能调用。
调用步骤
(1)AH中设置系统功能调用号
(2)在指定寄存器中设置入口参数
(3)使用中断调用指令执行功能调用
(4)根据出口参数分析调用情况
2.23
Htoascproc
Andal,0FH
Addal,90H
Daa
Adcal,40H
Daa
Movah,02H
Movdl,al
Int21H
Ret
Htoascendp
2.24
Numoutproc
Xorah,ah
Aam
Addax,3030H
Movdl,ah
Movah,02H
Int21H
Movdl,al
Movah,02H
Int31H
Ret
Numoutendp
2.25
Msgkeydb”inputnumber0-9”,”$”
Msgwrgdb”error”,”$”
Movah,09H
Movdx,offsetmsgkey
Int21H
Again:
movah,01H
Int21H
Cmpal,30H
Jbdisp
Cmpal,39H
Jadisp
Movdl,al
Movah,02H
Int21H
Jmpdone
Disp:
movdx,offsetmsgwrg
Movah,09H
Int21H
Jmpagain
Done:
movah,02H
Movdl,al
Int21H
第3章
3.1解:
汇编语言是一种以处理器指令系统为基础的低级程序设计语言,它采用助记符表达指令操作码,采用标识符号表示指令操作数,可以直接、有效地控制计算机硬件,因而容易创建代码序列短小、运行快速的可执行程序
3.2解:
(1)完整的汇编语言源程序由段组成
(2)一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列
(3)需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点
(4)所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内
(5)通常,程序还需要一个堆栈段
3.3解:
存储模式
特点
TINY
COM类型程序,只有一个小于64KB的逻辑段(MASM6.x支持)
SMALL
小应用程序,只有一个代码段和一个数据段(含堆栈段),每段不大于64KB
COMPACT
代码少、数据多的程序,只有一个代码段,但有多个数据段
MEDIUM
代码多、数据少的程序,可有多个代码段,只有一个数据段
LARGE
大应用程序,可有多个代码段和多个数据段(静态数据小于64KB)
HUGE
更大应用程序,可有多个代码段和多个数据段(对静态数据没有限制)
FLAT
32位应用程序,运行在32位80x86CPU和Windows9x或NT环境
3.4解:
开始位置:
用标号指明
返回DOS:
利用DOS功能调用的4CH子功能来实现
汇编停止:
执行到一条END伪指令时,停止汇编
3.5解:
段定位、段组合和段类型。
3.6解:
stacksegmentstack
db1024(0)
stackends
datasegment
stringdb'Hello,Assembly!
',0dH,0aH,‘$’
dataends
codesegment'code'
assumecs:
code,ds:
data,ss:
stack
start:
movdx,offsetstring
movah,9
int21h
codeends
endstart
3.7解:
(1).EXE程序
程序可以有多个代码段和多个数据段,程序长度可以超过64KB
通常生成EXE结构的可执行程序
(2).COM程序
只有一个逻辑段,程序长度不超过64KB
需要满足一定条件才能生成COM结构的可执行程序(MASM6.x需要采用TINY模式)
3.8解:
符号定义伪指令有“等价EQU”和“等号=”:
符号名EQU数值表达式
符号名EQU<字符串>
符号名=数值表达式
EQU用于数值等价时不能重复定义符号名,但“=”允许有重复赋值。
例如:
X=7;等效于:
Xequ7
X=X+5;“XEQUX+5”是错误的
3.9解:
(1)al=67h
(2)ax=133h,dx=4h
(3)ax=0230h
(4)al=41h
(4)ax=7654h
3.10解:
(1)
41h
42h
43h
10
10h
45h
46h
-1
?
4
4
4
-1
?
4
4
4
-1
?
4
4
4
(2)
10h
00h
0fbh
0ffh
?
?
?
?
?
?
3.11解:
.data
my1bdb'PersonalComputer'
my2bdb20
my3bdb14h
my4bdb00010100b
my5wdw20dup(?
)
my6c=100
my7c=<'PersonalComputer'>
3.12解:
利用定位伪指令控制,如org,even,align
3.13解:
包括逻辑地址和类型两种属性。
3.14解:
;数据段
org100h
varwdw1234h,5678h
varbdb3,4
varddd12345678h
buffdd10dup(?
)
messdb'Hello'
;代码段
movax,offsetvarb+offsetmess
movax,typebuff+typemess+typevard
movax,sizeofvarw+sizeofbuff+sizeofmess
movax,lengthofvarw+lengthofvard
3.15解:
(1)1000超过一个字节所能表达的最大整数
(2)SI应为偶数
(3)两个内存单元不能直接运算
(4)应改为[al+1]
(5)条件转移指令后面应接标号,而不是变量
3.16解:
movah,1;只允许输入小写字母
int21h
subal,20h;转换为大写字母
movdl,al
movah,2
int21h;显示
3.17解:
movbx,offsetLEDtable
moval,lednum
xlat
3.18解:
movax,bufX
cmpax,bufY
jaedone
movax,bufY
done:
movbufZ,ax
3.19解:
.modelsmall
.stack
.data
bufXdw-7
signXdb?
.code
.startup
cmpbufX,0;testbufX,80h
jlnext;jnznext
movsignX,0
jmpdone
next:
movsignX,-1
done:
.exit0
end
3.20解:
movdl,’2’
movax,bufX
cmpax,bufY
jenext1
decdl
next1:
cmpax,bufZ
jenext2
decdl
next2:
movah,2
int21h
3.21解:
;代码段
moval,number
movbx,0;BX←记录为1的位数
restart:
cmpal,0;AL=0结束
jzdone
again:
shral,1;最低位右移进入CF
jcnext;为1,转移
incbx;不为1,继续
jmpagain
next:
pushax
pushbx
shlbx,1;位数乘以2(偏移地址要用2个字节单元)
jmpaddrs[bx];间接转移:
IP←[table+BX]
;以下是各个处理程序段
fun0:
movdl,'0'
jmpdisp
fun1:
movdl,'1'
jmpdisp
fun2:
movdl,'2'
jmpdisp
fun3:
movdl,'3'
jmpdisp
fun4:
movdl,'4'
jmpdisp
fun5:
movdl,'5'
jmpdisp
fun6:
movdl,'6'
jmpdisp
fun7:
movdl,'7'
jmpdisp
;
disp:
movah,2;显示一个字符
int21h
popbx
popax
jmprestart
done:
…
3.22编制程序完成12H、45H、0F3H、6AH、20H、0FEH、90H、0C8H、57H和34H等10个字节数据之和,并将结果存入字节变量SUM中(不考虑溢出和进位)。
;wjxt322.asm
.modelsmall
.stack
.data
b_datadb12h,45h,0f3h,6ah,20h,0feh,90h,0c8h,57h,34h;原始数据
numequ10;数据个数
sumdb?
;预留结果单元
.code
.startup
xorsi,si;位移量清零
xoral,al;取第一个数
movcx,num;累加次数
again:
addal,b_data[si];累加
incsi;指向下一个数
loopagain;如未完,继续累加
movsum,al;完了,存结果
.exit0
end
3.23求主存0040h:
0开始的一个64KB物理段中共有多少个空格?
;wjxt323.asm
.modelsmall
.code
start:
movax,0040h;送段地址
movds,ax
movsi,0;偏移地址
movcx,si;计数(循环次数)
xorax,ax;空格计数器清零
again:
cmpbyteptr[si],20h;与空格的ASCII码比较
jnenext;不是空格,转
incax;是空格,空格数加1
next:
incsi;修改地址指针
loopagain;cx=cx-1,如cx=0退出循环
.exit0
endstart
3.24编写计算100个16位正整数之和的程序。
如果和不超过16位字的范围(65535),则保存其和到wordsum,如超过则显示‘overflow’。
答:
;数据段
countequ100
parraydwcountdup(?
);假设有100个数据
wordsumdw0
msgdb‘overflow’,’$’
;代码段
movcx,count
movax,0
movbx,offsetparray
again:
addax,[bx]
jncnext
movdx,offsetmsg
movah,9
int21h;显示溢出信息
jmpdone;然后,跳出循环体
next:
addbx,2
loopagain
movwordsum,ax
done:
…
3.25编程把—个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。
转换算法可以是:
用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以l00、10和l,得到“百位”、“十位”和“个位”。
;wjxt325.asm
.modelsmall
.stack256
.data
arraydw?
;源字数据
dbcddb5dup(?
);五位bcd结果,高对高低对低
.code
.startup
movdx,array;取源数据(余数)
movbx,10000;除数
movcx,10;除数系数
movsi,4;目的数据高位位移量
again:
movax,dx;dx.