微机原理及接口第一章作业答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“微机系统原理与接口技术”第一章习题解答(部分)
(1)(0110 1110)二进制原码=(+110 1110)二进制真值=(+110)十进制真值
(0110 1110)二进制反码=(+110 1110)二进制真值=(+110)十进制真值
(0110 1110)二进制补码=(+110 1110)二进制真值=(+110)十进制真值
2.写出下列二进制数的原码、反码和补码(设字长为8位):
(1) (+101 0110)二进制真值=(0101 0110)原码=(0101 0110)反码=(0101 0110)补码
(3)(-101 0110)二进制真值=(1101 0110)原码=(1010 1001)反码=(1010 1010)补码
3.下面各二进制数分别代表原码、反码和补码时,其等效的十进制数值为多少?
(2)(1111 1111)二进制原码=(-127)十进制真值
(1111 1111)二进制反码=(-0)十进制真值
(1111 1111)二进制补码=(-1)十进制真值
4.已知X1=+0010100,Y1=+0100001,X2=-0010100,Y2=-0100001,试计算下列各式(设字长为8位):
(1) [X1+Y1]补= [X1]补+[Y1]补= 0001 0100 +0010 0001 = 0011 0101
(2) [X1-Y2]补= [X1]补+[-Y2]补= 0001 0100 +0010 0001 = 0011 0101
(3) [X2-Y2]补= [X2]补+[-Y2]补= 1110 1100 +0010 0001 = 0000 1101
(4) [X2+Y2]补= [X2]补+[Y2]补= 1110 1100 +1101 1111 = 1100 1011
5.用补码判断下列算式是否发生溢出,若不溢出,计算其结果(设字长为8位):
(4)-85-60=[10101011]补+[11000100]补
运算结果显示:最高位有进位,次高位无进位,结果溢出。
6.将下列数表示成规格化的单精度浮点数:
(1)(69.34)十进制=(0100 0101. 0101 0111 0001 0100…)二进制
=(1. 0001 0101 0101 1100 0101 00)二进制×26
=(0 10000101 00010101010111000101000)单精度浮点数
(2)(-38.57)十进制=(-10 0110. 1001 0001 1110 1…)二进制
=(-1. 0011 0100 1000 1111 01…)二进制×25
=(1 10000100 00110100100011110101110)单精度浮点数
注:小数部分根据具体精度要求取一定位数即可。
通常至少保证5位有效位数。
7.将下列数值转换为BCD码:
(2)12710=(0001 0010 0111)组合BCD
(3)00100010B=3410=(0011 0100)组合BCD
“微机系统原理与接口技术”第二章习题解答(部分)
(1)字长(i ) a. 指由8个二进制位组成的通用基本单元。
(2)字节( a )b. 是CPU指令执行时间的刻度。
(3)指令(h ) c. CPU所能访问的存储单元数,与CPU地址总线条数有关。
(4)基本指令执行时间(g ) d. 惟一能代表存储空间每个字节单元的地址,用5位十六进制数表示。
(5)指令执行时间(j ) e. CPU执行访问存储器或I/O操作所花时间。
(6)时钟周期( b )f. 由段基址和偏移地址组成,均用4位十六进制数表示。
(7)总线周期( e )g. 指寄存器加法指令执行所花时间。
(8)Cache (k )h. 完成操作的命令。
(9)虚拟存储器(l )i. 指CPU在交换、加工、存放信息时信息位的最基本长度。
(10)访存空间( c )j. 各条指令执行所花时间,不同指令值不一。
(11)实际地址( d )k. 为缓解CPU与主存储器间交换数据的速度瓶颈而建立的高速缓冲存储器。
(12)逻辑地址( f )l. CPU执行程序时看到的一个速度接近内存却具有外存容量的假想存储器。
3.在下列各项中,选出8086的EU和BIU的组成部件,将所选部件的编号填写于横线上。
EU (3).(7).(9).(12)
BIU (4).(5).(6).(8).(10).(11)
(1)地址部件AU (2)段界检查器
(3)ALU (4)20位地址产生器
(5)20位物理地址加法器(6)指令队列
(7)状态标志寄存器(8)总线控制逻辑
(9)控制单元(10)段寄存器组
(11)指令指针(12)通用寄存器组
4.试将左边的标志和右边的功能联系起来。
要求:
(1)在括号中填入右边的功能代号。
(2)填写其类型(属于状态标志填S,属于控制标志填C)。
(3)写出各标志为0时表示的状态。
7.有一个由20个字组成的数据区,其起始地址为610AH:1CE7H。
试写出该数据区首末单元的实际地址PA。
首单元地址:610A0H+1CE7H=62D87H
末单元地址:62D87H+27H=62DAEH
注:20个字共占用了40个字节,末单元的偏移量为39(即十六进制的27H)
8.若一个程序段开始执行之前,(CS)=97F0H,(IP)=1B40H。
试问该程序段启动执行指令的实际地址是多少?
实际物理地址=97F00H+1B40H=99A40H
9.若堆栈段寄存器(SS)=3A50H,堆栈指针(SP)=1500H,试问这时堆栈栈顶的实际地址是多少?
堆栈栈顶的实际物理地址=3A500H+1500H=3BA00H
12.有两个16位的字31DAH、5E7FH,它们在8086系统存储器中的地址为00130H和00135H,试画出它们的存储器示意图。
13.有一个32位的地址指针67ABH:2D34H存放在从00230H开始的存储器中,试画出它们的存放示意图。
地址
00230H
00231H
00232H
00233H
14.将下列字符串的ASCII码依次存入从00330H开始的字节单元中,试画出它们的存放示意图:
U︺E︺S︺T︺C (︺为空格符)
地址
00330H
00331H
00332H
00333H
00334H
00335H
00336H
00337H
00338H
15.存储器中每一个段最多为64KB,当某程序routadf运行后,用DEBUG命令显示出当前各寄存器的内容如下,要求:
(1)画出此时存储器分段的示意图。
说明地址
代码段(附加段)首地址11A70H
…
堆栈段首地址21BE0H
…
堆栈段末地址21CA7H
栈底21CA8H
…
(2)写出各状态标志的值:
B>C:debug routadf.exe
r
AX=0000 BX=0000 CX=006D DX=0000
SP=00C8 BP=0000 SI=0000 DI=0000
DS=11A7 ES=11A7 SS=21BE CS=31B8 IP=0000
NV UP EI PL NZ NA P0 NC
OF=0,DF=0,IF=1,SF=0,ZF=0,AF=0,PF=0,CF=0
16.已知(SS)=20A0H,(SP)=0032H,欲将(CS)=0A5BH,(IP)=0012H,(AX)=0FF42H,(SI)=537AH,(BL)=5CH 依次推入堆栈保存。
要求:
(1)画出堆栈存放示意图。
地址
入栈完毕时的当前栈顶SP 20A28H
20A29H
20A2AH
20A2BH
20A2CH
20A2DH
20A2EH
20A2FH
20A30H
20A31H
栈底(初始栈顶SP)20A32H
(2)写出入栈完毕时SS和SP的值:
(SS)=20A0H(不变),(SP)=0028H
“微机系统原理与接口技术”第三章习题解答
1.下列各条指令是否有错?如果有,请指出错误之处并改正。
(1)MOV DS,1000H
(2)MOV [100],23H
(3)ADD AX,[BX+BP+6]
(4)PUSH DL
(5)IN AX,[3FH]
(6)OUT 3FFH,AL
(7)LES SS,[SI]
(8)POP [AX]
(9)IMUL 4CH
(10)SHL BX,5
(11)INT 300
(12)XCHG DX,0FFFH
答:(1)错误。
不允许直接向段寄存器送立即数,可改为:
MOV AX,1000H
MOV DS,AX
(2)错误。
该指令在语法上是对的,即可以把一个立即数送入一个存储单元;但是如果考虑实际编译,则第一操作数前应加上BYTE PTR或WORD PTR说明,否则汇编程序会因不能确定操作数长度而指示出错。
可改为:
MOV BYTE PTR [100],23H
(3)错误。
不能同时使用两个基址寄存器BX、BP进行间接寻址,可改为:
ADD AX,[BX+DI+6]
(4)错误。
堆栈操作应以字为单位进行,而DL是一个字节。
可改为:
PUSH DX
(5)错误。
在输入/输出指令中,8位端口地址应直接写在操作数处。
可改为:
IN AX,3FH
(6)错误。
端口地址3FFH已超出8位二进制表示范围,16位端口地址应用DX。
可改为:
MOV DX,3FFH
OUT DX,AL
(7)错误。
LES指令的目操作数应该是通用寄存器,不能是段寄存器。
可改为:
LES AX,[SI]
(8)错误。
AX不能用于间接寻址,间接寻址只能用BX、BP、SI、DI四个寄存器之一。
可改为:
POP [BX]
(9)错误。
立即数不能做乘法指令的操作数,可改为:
MOV BL,4CH
IMUL BL
(10)错误。
当逻辑移位的次数大于1时,应该用CL指示次数。
可改为:
MOV CL,5
SHL BX,CL
(11)错误。
操作数300 255,已超出有效的中断类型码范围。
(12)错误。
XCHG指令不允许立即数做它的操作数。
可改为:
MOV CX,0FFFH
XCHG DX,CX
2.请指出以下各指令的源、目的操作数所使用的寻址方式。
(1)MOV SI,2100H
(2)SBB DISP[BX],7
(3)AND [DI],AX
(4)OR AX,[609EH]
(5)MOV [BX+DI+30H],CX
(6)PUSH ES:[BP]
(7)CALL [DI]DISP
(8)JNZ Short_ label
答:(1)源操作数:立即数寻址;目的操作数:寄存器寻址
(2)源操作数:立即数寻址;目的操作数:(带位移量的)基址寻址
(3)源操作数:寄存器寻址;目的操作数:变址寻址
(4)源操作数:直接寻址;目的操作数:寄存器寻址
(5)源操作数:寄存器寻址;目的操作数:(带位移量的)基址变址寻址
(6)源操作数:带段超越的基址寻址;目的操作数:隐含寻址
(7)只有一个操作数,为(带位移量的)变址寻址
(8)只有一个操作数,为相对寻址
3.在已学的指令中,可实现累加器清0的单条指令有哪些?比较它们的功能。
答:共有以下四种方法:
(1)M OV AX,0 ;仅将累加器清0,不会影响任何标志位
(2)S UB AX,AX;累加器清0的同时影响所有状态标志,具体地有:
;ZF、PF置1,CF、AF、SF、OF均清0
(3)A ND AX,0 ;将累加器清0,ZF、PF置1,CF、OF 、SF清0
(4)X OR AX,AX;将累加器清0,ZF、PF置1,CF、OF 、SF清0
4.若要判断某带符号数的正、负而不影响其原值,可使用哪些方法?
答:设带符号数为oprd,判断方法可有如下几种:
(1)执行指令ADD oprd,0 之后,判断S F:S F =0,oprd为正数,否则为负。
(2)执行指令SUB oprd,0 之后,判断S F:S F =0,oprd为正数,否则为负。
(3)执行指令CMP oprd,0 之后,可直接判断S F:S F =0,oprd为正数,否则为负;或者再接着执行指令JGE NOMINUS(即同时判断S F、O F),若程序转移至NOMINUS处,则oprd为正数,否则为负;同理,亦可在在执行完CMP oprd,0 之后再接着执行指令JL NOMINUS,若程序转移至NOMINUS处,则oprd为负数,否则为正。
(4)执行指令CMP oprd,80H(或8000H)之后,判断C F:C F =1,oprd为正数,否则为负。
(5)执行指令AND oprd,oprd(或全“1”)之后,判断S F:S F =0,oprd为正数,否则为负。
(6)执行指令TEST oprd,oprd(或全“1”)之后,判断S F:S F =0,oprd为正数,否则为负。
(7)执行指令TEST oprd,80H(或8000H)之后,判断S F:S F =0,oprd为正数,否则为负;或判断Z F:Z F =1,oprd为正数,否则为负。
(8)执行指令OR oprd,oprd(或全“0”)之后,判断S F:S F =0,oprd为正数,否则为负。
(9)执行指令XOR oprd,0 之后,判断S F:S F =0,oprd为正数,否则为负。
5.已知DS=2000H,有关的内存单元值为:(21000H)=00H,(21001H)=12H,(21200H)=00H,(21201H)=10H,(23200H)=20H,(23201H)=30H,(23400H)=40H,(23401H)=30H,(23600H)=60H,(23601H)=30H,符号COUNT 的偏移地址为1200H。
执行下列指令后,寄存器AX、BX、SI的值分别是多少?
MOV BX,OFFSET COUNT
MOV SI,[BX]
MOV AX,COUNT[SI][BX]
答:执行结果为BX=1200H,SI=1000H,AX=3040H。
6.设标志寄存器值原为0401H,AX=3272H,BX=42A2H。
执行指令SBB AL,BH之后,AX和标志寄存器的值分别是多少?
答:由标志寄存器的原值0401H可知,C F的原值为1,故指令执行之后AX=322FH,标志寄存器的值为0410H,即AF变为1,CF变为0,其余不变。
7.设若标志寄存器原值为0A11H,SP=0060H,AL=4。
下列几条指令执行后,标志寄存器、AX、SP的值分别是多少?
PUSHF
LAHF
XCHG AH,AL
PUSH AX
SAHF
POPF
答:指令执行后标志寄存器的值为0411H,AX=0411H ,SP=005EH。
8.设若内存单元DATA在数据段中偏移量为24C0H处,24C0H~24C3H单元中依次存放着55H、66H、77H、88H。
下列几条指令执行后,寄存器AX、BX、CL、SI、DS的值分别是多少?
LEA SI,DATA
MOV CL,[SI]
LDS BX,DATA
答:执行结果为AX=6655H,BX=6655H,CL=55H,SI=24C0H,DS=8877H。
9.若AX=26D3H,CX=7908H,C F=1,执行下列指令后,寄存器AX、CX的值分别是多少?C F=?O F=?
SAL CH,1
RCR AX,CL
ROL AL,1
答:执行结果为AX=0A64CH,CX=0F208H,C F=O F=0。
10.已知IP=1000H,C F=0,则执行指令JNC Short label后,下列各数中哪一个是可能的IP值?
(A)0FFFFH (B)0FFEH (C)10FEH (D)1100H
答:(B)
简析:条件转移指令执行前IP=1000H,执行JNC指令后IP=1002H;又因C F=0,所以应跳转至目标地址处,该处对应的新IP值=1002H+相对位移量。
由于条件转移指令的跳转范围在距本条指令-128~+127个字节内,即新IP值可能的取值范围为0F82H~1081H,因此只有答案B符合条件。
11.设DS=4500H,AX=0508H,BX=4000H,SI=0320H。
当8086CPU在最小组态下执行指令MOV [BX+SI +0100H],AX 时,各控制信号M/IO、DT/R、RD、WR在有效期间的状态分别是什么?数据总线和地址总线上的数分别是多少?
答:各控制信号M/IO、DT/R、RD、WR在有效期间的电平分别是:高、高、高、低。
数据总线上的数是0508H,地址总线上的地址是49420H。
12.已知有某字串BUF1的首址为0000H,BUF2的首址为0010H,数据段与附加段重合。
欲从BUF1处开始将10个字数据顺序传送至BUF2处,试在下面程序段的空白处填上适当的指令或操作数以实现上述功能。
LEA SI,BUF1
ADD SI,18
LEA DI,BUF2
ADD DI,18
STD
MOV CX,10
REP MOVSW
13.附加段中有某字符串首址为BLOCK,长17个字节。
欲查找其中第一次出现字符“e”的位置,并将该位置所在的偏移量入栈保护。
试在下面程序段的空白处填上适当的指令或操作数以实现上述功能。
MOV DI,OFFSET BLOCK
MOV AL,‘e’
MOV CX,17
CLD
REPNE SCASB
JNE OTHER
DEC DI
PUSH DI
OTHER:……(略)
14.已知附加段中有一块长50个字的数据区,首址为DEST。
欲编程将它们全部初始化为0FFFFH值,试在下面程序段的空白处填上适当的指令或操作数,以实现上述功能。
LEA DI,DEST
CLD
MOV AL,0FFH
REP STOSB
15.已知有程序段如下:
MOV AL,35H
MOV DL,AL
AND DL,0FH
AND AL,0F0H
MOV CL,4
SHR AL,CL
MOV BL,10
MUL BL
ADD AL,DL
执行之后,AL等于多少?该程序段完成了什么功能?
答:程序段执行后AL=23H。
该程序段实现了将AL中的1个组合BCD码转换为十六进制数并存回AL中的功能。
16.以HEX为首址的字节单元处存放着一串ASCII字符:“0123456789ABCDEF”,并有程序段如下:MOV BX,OFFSET HEX
LEA DI,HCOD
INC DI
STD
MOV AL,5CH
MOV AH,AL
AND AL,0FH
XLAT HEX
STOSB
MOV AL,AH
MOV CL,4
SHR AL,CL
XLAT HEX
STOSB
上述程序段执行后,字节单元HCOD及其相邻单元HCOD+1的内容是多少?该程序段的功能是什么?
答:程序段执行后,HCOD单元的内容是‘5’,HCOD+1单元的内容是‘C’。
该程序段将AL中存放的1字节十六进制数转换为2个对应的ASCII字符存放在HCOD及其相邻单元HCOD+1中。
17.有程序段如下:
MOV AL,DB1
MOV AH,0
MOV DL,10
L1:DIV DL
MOV BL,AH
MOV BH,0
PUSH BX
MOV AH,0
CMP AL,0
JNZ L1
……
若内存单元DB1的值为7BH,则程序将依次向堆栈压入哪些数据?该程序段实现了什么功能?
答:先后存入堆栈中的字数据依次是3、2、1。
该程序段实现了将一个字节的无符号十六进制数DB1转换为非组合BCD码存入堆栈的功能,堆栈中最先压入的是十进制数的个位(每个十进制位在堆栈中占1个字单元)。
18.下面的程序执行后,DX、AX的值分别是多少?
;以X为首址的字单元中的数据依次为1234H、5678H
;以Y为首址的字单元中的数据依次为8765H、4321H
……
LEA SI,X
LEA DI,Y
MOV DX,[SI+2]
MOV AX,X
ADD AX,X
ADC DX,[SI+2]
CMP DX,[DI+2]
JL L2
CMP AX,Y
JL L1
JMP EXIT
L1:MOV AX,1
JMP EXIT
L2:MOV AX,2
EXIT:……
答:执行结果为AX=2,DX=0ACF0H。
19.已知组合BCD码的存放情况如图所示,按要求编写计算程序:
←DATA1
←DATA2
←RES
(1)从DATA1单元开始,将8个组合BCD码累加起来,其和(超过1字节)存入以RES为首址的单元中(低位在前)。
答:一种可能的程序段实现如下:
……;8个组合BCD码累加
LEA SI,DATA1 ;SI指向DATA1处
CLD ;清D F,地址自动增量
LODSB ;AL中装入第一个BCD码,并修改SI
MOV CX,7 ;共加7次
MOV AH,0 ;AH用作高位,记录低位字节的进位
AGAIN:ADD AL,[SI] ;多个数累加,位权相同,不能用ADC
DAA ;组合码十进制调整
ADC AH,0 ;DAA不影响AH,只影响标志位
INC SI ;修改指针
LOOP AGAIN
MOV RES,AX ;将AX的全部16位送至字单元
……
(2)将它们看作2个分别以DATA1、DATA2为首址的8位十进制数(低位在前),求此两数之差并存入以RES 为首址的单元中。
答:一种可能的程序段实现如下:
……;2个8位十进数(4字节组合BCD码)相减
LEA SI,DATA2 ;SI指向被减数最低位
LEA BX,DATA1 ;BX指向减数最低位
LEA DI,RES ;DI指向结果单元最低位
CLD ;清D F,地址自动增量
MOV CX,4 ;共减4次
CLC ;清C F,使首次执行SBB时结果正确
NEXT:LODSB ;向AL装入被减数,并修改SI
SBB AL,[BX] ;带借位相减
DAS ;组合码的十进制调整,影响标志位
STOSB ;存放结果,并修改DI
INC BX ;修改BX
LOOP NEXT
……
20.有一个64位二进制数,由高位字到低位字分别存放在DX、CX、BX、AX四个16位数据寄存器中。
将该数视为无符号数,编程把它左移1位;再当作带符号数,编程把它右移2位。
答:(1)一种可能的无符号数左移的程序段实现如下:
……
SAL AX,1
RCL BX,1
RCL CX,1
RCL DX,1
……
简析:64位数的整体左移应从最低位字开始,借助C F把每次向左移出的D15位移入高位字的D0位。
在SAL/SHL、ROL、RCL几条左移指令中,只有RCL能够把C F移入D0位,故应选用该循环移位指令。
注意,若第一次左移AX时也使用RCL,应首先将C F清0。
(2)一种可能的带符号数右移2位的程序段实现如下:
……
MOV SI,2 ;循环次数
AGN:SAR DX,1
RCR CX,1
RCR BX,1
RCR AX,1
DEC SI
JNZ AGN
……
简析:64位带符号数的整体右移应从最高位字开始。
最高位字右移时需将符号位(D15)复制,并将右移出的D0位移入低位字的D15位;余下的三个低位字则不再复制D15位。
故首次右移应使用SAR指令,而后3次右移使用RCR指令。
另外,本例要求右移2位,因C F只能保存一个二进制位,若直接使用
SAR/RCR 数据寄存器,CL
这样的指令进行移位,将无法得到正确的移位结果。
所以用循环程序完成2次移位。
21.设V AR字单元的值为x,F1字单元的值为y,试编程按以下要求给y赋值:
2 x>30
y = 0 30≥x≥1
-2 x<1
答:一种可能的程序段实现如下:
……
MOV AX,V AR ;AX x
CMP AX,30
JG PLUS2 ;x>30,则转PLUS2
CMP AX,1
JL MIN2 ;x<1,则转MIN2
MOV F1,0 ;30≥x≥1,y=0
JMP GO
PLUS2:MOV F1,2 ;y=2
JMP GO
MIN2:MOV F1,-2 ;y = -2或00FEH
GO:……;后续处理
简析:本例中并未说明V AR字节单元是带符号数还是无符号数,读者在使用判断转移指令时可任意选用。
若当作带符号数,应使用JG、JL、JGE、JLE等指令,如参考程序;若当作无符号数,则应使用JA、JB、JAE、JBE等指令。
“微机系统原理与接口技术”第四章习题解答(部分)
1.判断以下说法是否正确,如有错,请说明原因并改正。
(1)伪指令在汇编过程中不会产生二进制代码。
(2)宏和过程的相同之处是都可用于简化源程序书写、精简目标代码。
(3)在计算机中,高级语言通常需要转换为汇编语言后才能执行。
(4)汇编语言程序上机一般包括编辑、汇编、链接和调试几个步骤。
答:(1)正确。
(2)错误。
宏不能精简目标代码。
(3)错误。
高级语言程序经编译或解释后直接转换为目标代码。
(4)正确。
2.已知数据和符号定义
A1 DB ?
A2 DB 8
判断下列指令的正误,并说明错误指令的原因。
(1)MOV K1,AX
(2)MOV A2,AH
(3)MOV BX,K1
MOV [BX],DX
(4)CMP A1,A2
(5)K1 EQU 200
答:(1)错误。
K1是符号常数,在此处相当于立即数100,故不能做目的操作数。
(2)正确。
(3)正确。
(4)错误。
A1、A2都是字节变量,相当于两个存储器单元,故不能同时出现在一条指令中直接进行比较。
(5)错误。
用EQU定义的符号不能重新赋值,除非已用PURGE解除了原值。
3.若数据段中有定义
NUM1 EQU 23H
NUM2 DW 0
则指令MOV NUM2,NUM1 的源、目操作数的寻址方式以及指令执行后NUM2+1单元的内容分别是什么?
答:指令MOV NUM2,NUM1的源操作数使用立即数寻址,目的操作数使用直接寻址。
指令执行后NUM2+1单元的内容是0。
4.设DS=6000H,BX=8432H,SS=5000H,SP=3258H,内存69632H~69635H单元的内容依次是00H、11H、22H、33H。
4字节指令CALL DWORD PTR [BX+1200H] 本身位于2000H:3250H处的双字单元中。
当8086执行该指令后转移至子程序入口时,CS、IP、SS、SP各寄存器以及栈顶2个字单元的内容分别是多少?
答:执行结果为CS=3322H,IP=1100H,SS=5000H,SP=3254H,栈顶的两个字即断点地址,为2000H:3254H。
5.已知某数据段从物理地址03000H处开始,定义如下:
DSEG SEGMENT
ORG 2000H
A1 DD 2 DUP(7,1,?)
A2 DB 10 DUP(0,4,3 DUP(2),5)
CNT EQU 20H
A3 DW 100 DUP(?)
DSEG ENDS
请分别用分析运算符SEG、OFFSET、LENGTH、SIZE、TYPE
A1、A2、A3的段基址、偏移量、类型及它们的LENGTH、SIZE。
答:(SEG A1)=0300H,(OFFSET A1)=2000H,(TYPE A1)=4(LENGTH A1)=2,(SIZE A1)=2×4=8;
(SEG A2)=0300H,(OFFSET A2)=2018H,(TYPE A2)=1
(LENGTH A2)=10,(SIZE A2)=10×1=60;
(SEG A3)=0300H,(OFFSET A3)=2054H,(TYPE A3)=2
(LENGTH A3)=100,(SIZE A3)=100×2=200
6.已知符号定义语句如下:
ALPHA EQU 100
BETA EQU 25
GAMMA EQU 2
分别求下列各表达式的值。
(1)ALPHA*4 GT BETA = 100*4 GT 25 = 0FFFFH ARA1(0006H) ARA2(000AH) ARA3(0010H)
(3)(BETA / 3)LE 5 =(25 / 3)LE 5 = 0
(4)ALPHA AND BETA = 100 AND 25 = 64H & 19H = 0
(5)GAMMA XOR(BETA EQ 25)= 2 (25 EQ 25)= 0FFFDH
7.已知数据段定义如下:
DSEG SEGMENT
ORG 6
ARA1 DD 110009H
ARA2 DW 2 DUP(?),‘64’
CONT1 EQU $-ARA2
COUT2 EQU ARA2 -ARA1
ARA3 DB CONT1 DUP(0FFH)
ARA4 DB 2 DUP (?, CONT2 DUP (5), ’$’ )
ORG $+2
VAR2 DW 569AH
DB ‘AB’
DSEG ENDS
用示意图说明该数据段的存贮单元分配情况。
答:有关存储单元的内容如右图所示。
8.下列程序是否有错?如有错,请改正。
该程序完成什么功能?。
DATA SEGMENT
INBUF DW 100 DUP(?)
OUTBUF DW 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
INIT:MOV SI,OFFSET INBUF
LEA DI,OUTBUF
MOV CX,100
REP MOVSB
MAIN ENDP
CODE ENDS
END MAIN
答:改正之后的源程序清单如下(下划波浪线的语句是原来没有的或有错之处):DATA SEGMENT
INBUF DW 100 DUP(?)
OUTBUF DW 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA ;原ASSUME语句未说明ES MAIN PROC FAR
PUSH DS ; 补充的三条指令为主程序返回提供正确的地址
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV ES,AX ; MOVS指令以ES:DI为目的串指针,故应对ES赋值
INIT:MOV SI,OFFSET INBUF
LEA DI,OUTBUF
MOV CX,100
CLD ; 从首址开始传送,应使D F=0
REP MOVSW ; 应传送的是100个字而非字节
RET ; 程序结束,返回DOS
MAIN ENDP
CODE ENDS
END MAIN
该程序完成的功能是:将INBUF表内的10个字数据复制到以OUTPUT开始的连续的内存单元中。
9.下面的程序段中有2条转移指令,计算它们的相对位移量并填在空缺的机器代码处。
1000:001B F3A6 REPZ CMPSB
1000:001D 75 01 JNZ 0020
1000:001F CB SAME:RET
1000:0020 41 FOUND:INC CX
1000:0021 890E0600 MOV [0006],CX
1000:0025 EB F8 JMP 001F
答:两处空缺的机器码分别为01H、0F8H。
简析:
JNZ指令采用相对寻址方式,本例程序中JNZ的目标地址是同一段中偏移量为0020H处,当前IP=001FH,故有:相对偏移量=目标地址-当前IP值=01H。
JMP指令有多种寻址方式,本例程序中的JMP为段内直接跳转,也采用相对寻址方式。
因当前IP=0027H,目标地址为001FH,因此有:相对偏移量=目标地址-当前IP值=0F8H(-8的补码)。
10.1
11.1
12.程序功能:找出DATA1表中最大和最小的无符号数。
BX最小0,AX最大0ffffh
13.读下面程序,在其中的空处添上适当内容。
该程序完成了什么功能?程序运行后,变量RS的值是多少?
DATA SEGMENT
BUF DB -13,24,5,-62,77,20,-7,145,0
CNT DB $ -BUF
RS DB 0
DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DB 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA BX,BUF
MOV CH,0
LP:MOV AL,[BX]
TEST AL,80H
JE CONT
INC RS
CONT:INC BX
LOOP LP
RET
START ENDP
CODE ENDS
END START
答:程序空处可填CNT,字节变量RS的最后结果是04H。
该程序实现的功能是:统计数据段中以BUF为首址的带符号字节数据表中负数的个数,CNT为表中所有数据的个数,即表的长度。
需要注意的是:十进制数据“145”在以二进制带符号字节数据形式存放时相当于“-111”。
14.编写一个完整的源程序,将数据35、-27、-13、6、-47、52、9、-3中的正数放入以BUFFER为首址的数据缓冲区中。
答:一种可能的程序如下实现:
DATA SEGMENT
BLOCK DB 35,-27,-13,6,-47,52,9,-3
COUNT EQU $-BLOCK
BUFFER DB COUNT DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DW 40 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
BEGIN:MOV AX,DATA
MOV DS,AX
MOV ES,AX ;需用STOS串操作指令
MOV CX,COUNT
LEA SI,BLOCK ;源数据区指针
LEA DI,BUFFER ;正数存放区指针
CLD ;自动增量
AGAIN:LODSB ;取源数据,并修改SI
TEST AL,80H ;取符号位,不影响AL
JS GO ;符号位=1,是负数,不存
STOSB ;存正数并修改DI
GO:LOOP AGAIN
MOV AH,4CH ;退出循环,返回DOS
INT 21H
CODE ENDS
END BEGIN
15.已知有一个长100个字的数据块,存放在以3DA0H:1000H开始的存储区域内。
试编写一个完整的汇编语言程序,将该数据块复制到以3DA0H:1008H开始的存储区内。
答:一种可能的程序如下实现:
DATA SEGMENT AT 3DA0H
ORG 1000H
SSEG SEGMENT PARA STACK‘SSEG’
DB 100 DUP(?)
SSEG ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:SSEG,DS:DATA,ES:DATA
MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,SEG BLOCK
MOV DS,AX
MOV ES,AX
MOV CX,200 ;重复次数
LEA SI,BLOCK
ADD SI,199 ;SI=10C7H
MOV DI,SI
ADD DI,8 ;DI=10CFH
STD ;自动减量
REP MOVSB
RET
MAIN ENDP
CODE ENDS
END MAIN
简析:
由题意可知,源数据区(占用地址3DA0:1000H~3DA0:10C7H,共200个字节)与目标数据区(占用地址3DA0:1008H~3DA0:10CFH,共200个字节)是重叠的。
若从首址开始增量传送(D F=0),将破坏1008H以后的源数据,所以必须从末址向首址减量传送(D F=1)。
数据段初始化时,有以下几点需注意:段基址规定为3DA0H,故应在段定义伪指令SEGMENT后加上AT 语句;源数据区首址的偏移量规定为1000H,故应使用ORG语句指明;对源、目标数据区进行定义时,应注意目标数据区首址的偏移量是1008H。
如果定义为:
ORG 1000H
SOUR DW 100 DUP(?);源数据区
DEST DW 100 DUP(?);目标数据区
则目标数据区首址的偏移量实际上是10C8H,不合题意。
可将它们统一定义为足够长度(至少104字或208字节)的变量,如参考程序所示。
指针初始化时,可以将SI、DI分别置为10C7H、10CFH,且CX=200,即进行字节的传送,使用MOVSB;亦可将SI、DI分别置为10C6H、10CEH,且CX=100,即进行字的传送,相应使用MOVSW。
16.从内存单元BUF开始的缓冲区中有7个8位无符号数,依次为13H、0D8H、92H、2AH、66H、0E0H、3FH。
编程找出它们的中间值并放入RES单元,且将结果以“(RES) = ?”的格式显示在屏幕上。
答:一种可能的程序如下实现:
DATA SEGMENT
BUF DB 13H,0D8H,92H,2AH,66H,0E0H,3FH
RES DB ?;中间数的存放单元
STR DB ‘(RES)=’
STR1 DB ?,?,‘$’;结果字符串
DATA ENDS
SSEG SEGMENT PARA STACK‘SSEG’
CODE SEGMENT
ASSUME CS:CODE,SS:SSEG,DS:DATA,ES:DATA
MAIN PROC FAR ;主程序
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX ;有STOS指令,需用ES
MOV CX,6 ;外循环次数,比6次
AGN:MOV SI,OFFSET BUF
MOV DI,SI
INC DI ;SI、DI指向相邻2数
MOV DX,6 ;内循环次数,比6次
AGN1:MOV AL,[SI]
CMP AL,[DI] ;两个无符号数相比较
JB UNCH ;小于则转,不互换
EXCH:XCHG AL,[ DI ] ;前1单元较大,则互换
MOV [ SI ],AL ;大数放在后面
UNCH:INC SI ;修改指针,指向下一个数
INC DI
DEC DX
JNZ AGN1 ;未处理完,继续内循环
LOOP AGN ;外循环
DONE:MOV AL,[SI-3] ;排序完成,取中间数
MOV RES,AL
AND AL,0F0H ;分离高半字节
MOV CL,4
SHR AL,CL
CALL BATR ;调子程序,将AL值转换为ASCII码
LEA DI,STR1 ;DI指向结果单元
CLD
STOSB ;存放转换结果
MOV AL,RES
AND AL,0FH ;分离并转换低半字节
CALL BATR
STOSB
LEA DX,STR ;显示整个字符串
MOV AH,09H
INT 21H
RET
MAIN ENDP ;主程序MAIN结束
;子程序BATR,实现16进制数到ASCII码的转换
BATR PROC NEAR
CMP AL,10 ;入口参数为AL
JB NUM ;是数字,则转NUM
ADD AL,’A’-10-’0’;字母
NUM:ADD AL,’0’
BATR ENDP ;子程序结束
CODE ENDS
END MAIN
简析:
本例的基本思路是:先把7个无符号数按大小排序,排序完成之后取位于中间的一个数即为中间值。
然后将该16进制数转换为两个对应的ASCII码,再与要求的格式字符一起输出送显即可。
数据排序可以是从大到小、或从小到大排列,本参考程序完成从小到大排序,由一个双重循环结构实现。
内循环完成一个数与其它数之间的一一比较,并使每次比较所得的小数置于低地址单元。
外循环实现所有数之间的两两相较。
共7个数据,故内、外循环中的比较次数均为6次。
编程时需注意:无符号数比较大小应使用JA、JB、JAE、JBE指令,本例完成从小到大的排列,故用JB 控制转移到UNCH;若要从大到小排列,则用JA代替JB即可。
对两个循环体进行初始化时,需仔细考虑指针和循环控制寄存器的初值。
在数据段的定义中,分别定义STR、STR1两个变量名字,是为了便于在STR1处存放转换结果;显示时使DX直接指向STR,以STR1末尾的“$”为结束符。
中间值找出之后,应把高、低半字节相分离,并分别转换为各所对应的ASCII码。
17.设某测试系统中,1号端口为测试口,所得数据是0~9之间的十进制整数;2号端口为显示口,对应于数字0~9的LED七段共阴显示码依次为:3FH、06H、5BH、4FH、66H、6DH、3DH、07H、7FH、6FH。
编写一段查表送显的程序,要求:先从测试口读入一个数据,再查表将相应的显示码从显示口送出,如此反复进行直至读入数据“0FFH”为止。
答:一种可能的程序如下实现:
DATA SEGMENT
TAB DB 3FH,06H,5BH,4FH,66H
DB 6DH,3DH,07H,7FH,6FH ;0~9的七段码
DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DW 50 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA BX,TAB ;BX指向表首址
NEXT:IN AL,1 ;从测试口输入
CMP AL,0FFH
JE STOP ;是0FFH,结束
XLAT TAB ;不是0FFH,查表转换
OUT 2,AL ;向显示口输出七段码
JMP NEXT ;继续测试
STOP:MOV AH,4CH
INT 21H
CODE ENDS
END START
18.编程实现以下操作:从键盘输入4个数字,分别作为2个10~99之间的十进制数。
求它们的和,并把结果以三位十进制数的形式显示在屏幕上。
要求:输入回显的两个加数与送显的和之间有适当的分隔,以示区别。
格式可自行拟定。
答:一种可能的程序如下实现:
DATA SEGMENT
NUM1 DB ?,?;加数1,高位在前,以非组合BCD码存放
SUM DB ?,?,?,‘$’;存放结果的ASCII码,以‘$’为结束符DATA ENDS
STACK SEGMENT PARA STACK‘STACK’
DW 50 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA FIRST:MOV AX,SEG NUM1
MOV DS,AX
MOV ES,AX ;有STOS指令,需用ES
CLD ;自动增量,先输入高位
MOV CX,2
LEA DI,NUM1 ;输入加数1
IN1:MOV AH,1 ;DOS功能调用,单字符输入
INT 21H
AND AL,0FH ;ASCII码转换为非组合BCD码
STOSB
LOOP IN1
MOV DL,‘+’;输出加号,以分隔2个加数
MOV AH,2
INT 21H
MOV CX,2
LEA DI,NUM2 ;输入加数2
IN2:MOV AH,01H
INT 21H
AND AL,0FH
STOSB
LOOP IN2
MOV DL,‘=’;输出等号,分隔加数与结果
MOV AH,02H
INT 21H
LEA SI,NUM1
INC SI ;SI指向加数1的低位
LEA BX,NUM2
INC BX ;BX指向加数2的低位
LEA DI,SUM
ADD DI,2 ;DI指向结果的末单元
STD ;自动减量,由低向高相加
MOV CX,2 ;相加次数
CLC ;清进位,准备用ADC
AD:LODSB ;取加数1的低位,修改SI
ADC AL,[BX] ;2数相加,带进位
AAA ;未组合BCD码的十进制调整
PUSHF
ADD AL,30H ;BCD码向ASCII码转换
POPF
;因未组合BCD码的高4位为0,故加30H不会影响C F
STOSB ;存和,并修改DI。
C F不变
DEC BX ;指向加数2的高位。
C F不变。