第1章微型计算机系统概述
1. 简述微型计算机系统的组成。
2. 简述计算机软件的分类及操作系统的作用。
3. CPU是什么?写出Intel微处理器的家族成员。
4. 写出10条以上常用的DOS操作命令。
[参考答案]
1.答:微型计算机系统由硬件和软件两大部分组成,硬件又可细分为主机(由CPU、存储器、控制电路、接口等构成)、输入设备(如键盘)和输出设备(如显示器);软件可细分为系统软件(如操作系统)和应用软件。
3.答CPU(Central Processing Unit中央处理单元)是计算机的核心部件,它包括控制器和算术逻辑运算部件等。Intel 微处理器的家族成员有:8088/8086、80186、80286、80386、80486、Pentium(80586)、Pentium Ⅱ、Pentium Ⅲ 和Pentium IV。
第2章计算机中的数制和码制
1. 将下列十进制数转换成二进制数:
(1) 49;(2)73.8125;(3) 79.75
2. 将二进制数变换成十六进制数:
(1)101101B;(2)1101001011B;(3)1111111111111101B;
(4)100000010101B;(5)1111111B;(6)10000000001B
3. 将十六进制数变换成二进制数和十进制数:
(1)FAH;(2)5BH;(3)78A1H;(4)FFFFH; (5) 34.2AH;(6)B8.93H
4. 将下列十进制数转换成十六进制数:
(1)39;(2)299.34375;(3)54.5625
5. 将下列二进制数转换成十进制数:
(1)10110.101B;(2)10010010.001B;(3)11010.1101B
6. 计算(按原进制运算):
(1)10001101B+11010B;(2)10111B+11100101B;(3)1011110B-1110B;(4)124AH+78FH;(5)5673H+123H;(6)1000H-F5CH;
7. 已知a=1011B,b=11001B,c=100110B, 按二进制完成下列运算,并用十进制运算检查计算结果:
(1)a+b;(2)c-a-b;(3)a·b;(4)c/b
8. 已知a=00111000B, b=11000111B, 计算下列逻辑运算:
(1)a AND b;(2)a OR b;(3)a XOR b;(4)NOT a
9. 设机器字长为8位,写出下列各数的原码和补码:
(1)+1010101B;(2)-1010101B;(3)+1111111B;
(4)-1111111B;(5)+1000000B;(6)-1000000B
10. 写出下列十进制数的二进制补码表示(设机器字长为8位):
(1)15;(2)-1;(3)117;(4)0;
(4)-15;(5)127;(6)-128;(7)80
11. 设机器字长为8位,先将下列各数表示成二进制补码,然后按补码进行运算,并用十进制数运算进行检验:
(1)87-73;(2)87+(-73);(3)87-(-73);
(4)(-87)+73;(5)(-87)-73;(6)(-87)-(-73);
12. 已知a,b,c,d为二进制补码:a=00110010B, b=01001010B, c=11101001B, d=10111010B, 计算:
(1)a+b;(2)a+c;(3)c+b;(4)c+d;
(5)a-b;(6)c-a;(7)d-c;(8)a+d-c
13. 设下列四组为8位二进制补码表示的十六进制数,计算a+b和a-b,并判断其结果是否溢出:
(1)a=37H, b=57H; (2)a=0B7H, b=0D7H;
(3)a=0F7H, b=0D7H; (4)a=37H, b=0C7H
14. 求下列组合BCD数的二进制和十六进制表示形式:
(1)3251(2)12907(3)ABCD(4)abcd
15. 将下列算式中的十进制数表示成组合BCD码进行运算,并用加6/减6修正其结果:
(1)38+42;(2)56+77;(3)99+88;(4)34+69;
(5)38-42;(6)77-56;(7)15-76;(8)89-23
16. 将下列字符串表示成相应的ASCII码(用十六进制数表示):
(1)Example 1;(2)Jinan University;(3)-108.652;
(4)How are you?;(5)Computer(6)Internet Web
17. 将下列字符串表示成相应的ASCII码(用十六进制数表示):
(1)Hello(2)123
(4)The number is 2315
[参考答案]
1.解:(1)49=0011 0001B (2)73.8125=0100 1001.1101B
(3)79.75=0100 1111.11B
3. 解:(1)FAH=1111 1010B=250D (2)5BH=0101 1011B=91D
(3)78A1H=0111 1000 1010 0001B=30881D
(4)FFFFH=1111 1111 1111 1111B=65535D
5. 解:(1)10110.101B=22.625 (2)10010010.001B=14
6.0625
(3)11010.1101B=26.8125
7. 解:a=1011B=11, b=11001B=25, c=100110B=38
(1)a+b=100100B=36 (2)c-a-b=10B=2
(3)a·b=100010011B=275 (4)c/b=1……1101B(=13)
9. 解:(1)+1010101B 原码01010101B 补码01010101B
(2)-1010101B 原码11010101B 补码10101011B
(3)+1111111B 原码01111111B 补码01111111B
(4)-1111111B 原码11111111B 补码10000001B
(5)+1000000B 原码 01000000B 补码01000000B
(6)-1000000B 原码 11000000B 补码11000000B
11. 解:按补码表示+87=0101 0111B;+73=0100 1001B;-87=1010 1001B;-73=1011 0111B
(1)87-73=0101 0111B-0100 1001B=1110B=14
(2)87+(-73)=0101 0111B+1011 0111B=[1]0000 1110B=14(舍去进位)(3)87-(-73)=0101 0111B-1011 0111B=[-1]1010 0000B=-96(溢出)(4)(-87)+73=1010 1001B+0100 1001B=1111 0010B=-14
(5)(-87)-73=1010 1001B-0100 1001B=[-1]0110 0000B=96(溢出)(6)(-87)-(-73)=1010 1001B-1011 0111B=1111 0010B=-14
13. 解:(1)a=37H, b=57H; a+b=8EH; a-b=[-1]E0H=-32
(2)a=0B7H, b=0D7H; a+b=[1]8EH=-114; a-b=[-1]E0H=-32
(3)a=0F7H, b=0D7H; a+b=[1]CEH=-50; a-b=20H=32
(4)a=37H, b=0C7H; a+b=FEH=-2; a-b=[-1]70H=112
15. 解:(1)将38、42表示成组合BCD码:38H、42H,然后按二进制进行运算,并根据运算过程中的AF,CF进行加6/减6修正。38H+42H=7AH,低4位需要加6修正:7AH+6=80H,所以有38+42=80;
(2)56H+77H=CDH,高4位、低4位都应加6修正:CDH+66H=[1]33H,因此有56+77=133;
(3)99H+88H=[1]21H(AF=1), 高4位、低4位都应加6修正:
[1]21H+66H=[1]87H, 因此99+88=187
(4)34H+69H=9DH, 低4位需要加6修正:9DH+6=A3H, 修正结果使高4位超出9, 这时再对高4位进行加6修正: A3H+60H=[1]03H, 因此34+69=103
(5)38H-42H=[-1]F6H, 因CF=1(有借位), 高4位应减6修正:
[-1]F6H-60H=[-1]96H, 指令的借位应表示成100的补码, 因此
38-42=96-100=-4
(6)77H-56H=21H, 不需要修正, 因此77-56=21
(7)15H-76H=[-1]9FH, 高4位、低4位都应减6修正: [-1]9FH-66H=[-1]39H, 因此15-76=39-100=-61
(8)89H-23H=66H, 不需要修正, 因此89-23=66
17. 解:字符串的ASCII码(用十六进制数表示)为:
(1)48,65,6C,6C,6F
(2)31,32,33,0D,34,35,36
(3)41,53,43,49,49
(4)54,68,65,20,6E,75,6D,62,65,72,20,69,73,20,32,33,31,35
第3章微机系统中的微处理器
3.1例题
例3-1 有一块120个字的存储区域,其起始地址为625A:234D,写出这个存储区域首末单元的物理地址。
解:存储区域的字节数为:2×120=240=0F0H,
首地址为:625AH×10H+234DH=648EDH,
末地址为:648EDH+0F0H=649DDH,
或者:625AH×10H+(234DH+0F0H)=625A0H+243DH=649DDH。
例3-2 两个十六进制数7825H和5A1FH分别相加和相减后,求运算结果及各标志位的值。
解:7825H+5A1FH=0D244H,AF=1,CF=0,ZF=0,SF=1,OF=1(当将7825H和5A1FH 看作有符号数时,两个正数相加得到一个负数,结果显然是错误的,实际上,在运算过程中,次高位产生了进位而最高位没有产生进位,故运算产生溢出),PF=1(因为在44H中包含有偶数个1)。
7825H-5A1FH=1E06H,AF=1,CF=0,ZF=0,SF=0,OF=0,PF=1。
5A1FH-7825H=0E1FAH,AF=0,CF=1,ZF=0,SF=1,OF=0,PF=1。
3.2习题
1.微处理器内部结构由哪几部分组成?阐述各部分的主要功能。
2.微处理器级总线有哪几类?各类总线有什么作用?
3.为什么地址总线是单向的,而数据总线是双向的?
4.8086/8088微处理器内部有哪些寄存器?其主要作用是什么?
5.如果某微处理器有20条地址总线和16条数据总线:
(1)假定存储器地址空间与I/O地址空间是分开的,则存储器地址空间有多大?
(2)数据总线上传送的有符号整数的范围有多大?
6.将十六进制数62A0H与下列各数相加,求出其结果及标志位CF、AF、SF、ZF、OF和
PF的值:
(1)1234H;(2)4321H;(3)CFA0H;(4)9D60H
7.从下列各数中减去4AE0H,求出其结果及标志位CF、AF、SF、ZF、OF和PF的值:
(1)1234H;(2)5D90H;(3)9090H;(4)EA04H
8.什么是逻辑地址?什么是物理地址?它们之间的关系如何?
9.写出下列存储器地址的段地址、偏移地址和物理地址:
(1)2134:10A0;(2)1FA0:0A1F;(3)267A:B876
10.给定一个数据的有效地址为2359H,并且(DS)=490BH,求该数据的物理地址。
11.如果在一个程序段开始执行之前,(CS)=0A7F0H,(IP)=2B40H,求该程序段的第
一个字的物理地址。
12.下列操作可使用哪些寄存器?
(1)加法和减法;(2)循环计数;(3)乘法和除法;(4)保存段地址;
(5)表示运算结果的特征;(6)指令地址;(7)从堆栈中取数的地址;
13.IBM PC有哪些寄存器可用来指示存储器的地址?
14.设(BX)=637DH,(SI)=2A9BH,位移量=0C237H,(DS)=3100H,求下列寻址方
式产生的有效地址和物理地址:
(1)直接寻址;(2)用BX的寄存器间接寻址;(3)用BX的寄存器相对寻址;
(4)用BX和SI的基址变址寻址;(5)用BX和SI的基址变址且相对寻址
15.若(CS)=5200H时,物理转移地址为5A238H,那么(CS)变成7800H时,物理转移
地址为多少?
16.设(CS)=0200H,(IP)=2BC0H,位移量=5119H,(BX)=1200H,(DS)=212AH,
(224A0H)=0600H,(275B9H)=098AH。求使用下列寻址方式时的转移地址:
(1)段内直接寻址方式;
(2)使用BX的寄存器寻址的段内间接寻址方式;
(3)使用BX的寄存器相对寻址的段内间接寻址方式;
17.将下列两组的词汇和说明关联起来:
(1)CPU; A.保存当前栈顶地址的寄存器;
(2)EU; B.指示下一条要执行指令的地址;
(3)BIU; C.总线接口部件, 实现执行部件所需要的所有总线操作;
(4)IP ; D .分析并控制指令执行的部件;
(5)SP ; E .存储程序、数据等信息的记忆装置,PC 机有RAM 和ROM 两种;
(6)存储器; F .以后进先出方式工作的存储器空间;
(7)堆栈; G .把汇编语言程序翻译成机器语言程序的系统程序; (8)指令; H .惟一代表存储器空间中的每个字节单元的地址; (9)状态标志; I .能被计算机直接识别的语言;
(10)控制标志; J .用指令的助记符、符号地址、标号等符号书写程序的语言;
(11)段寄存器; K .把若干个模块连接起来成为可执行文件的系统程序; (12)物理地址; L .保存各逻辑段的起始地址的寄存器; (13)汇编语言; M .控制操作的标志,PC 机有三位:DF 、IF 、TF ; (14)机器语言; N .记录指令操作结果的标志,PC 机有六位:OF 、SF 、ZF 、AF 、PF 、CF ;
(15)汇编程序; O .执行部件,由算术逻辑单元(ALU )和寄存器组等组成; (16)连接程序; P .由汇编程序在汇编过程中执行的指令; (17)目标码; Q .告诉CPU 要执行的操作,在程序运行时执行; (18)伪指令 R .机器语言代码。
[参考答案]
1. 答:微处理器内部结构主要由算术逻辑运算单元(ALU )、控制器、工作寄存器和I/O
控制逻辑组成。算术逻辑运算单元是CPU 的核心,它完成所有的运算操作;控制器是CPU 的“指挥中心”,只有在它的控制下,CPU 才能完成指令的读入、寄存、译码和执行;工作寄存器用于暂时存储寻址信息和计算中间结果;I/O 控制逻辑用于处理I/O 操作。 3. 答:由于在计算机中地址总是由CPU 产生的,因此地址总线是单向的。而数据可从CPU
写到存储器,也可从存储器读到CPU ,因此数据总线是双向的。 5. 解:存储空间为110485762
20
==M 字节, 数据总线上传送的有符号整数的范围为
-32768~+32767。
7. 解:(1)1234H -4AE0H =C754H ;CF =1,AF =0,SF =1,ZF =0,OF =0,PF =0 (2)5D90H -4AE0H =12B0H ;CF =0,AF =0,SF =0,ZF =0,OF =0,PF =0 (3)9090H -4AE0H =45B0H ;CF =0,AF =0,SF =0,ZF =0,OF =0,PF =0 (4)EA04H -4AE0H =9F24H ;CF =0,AF =0,SF =1,ZF =0,OF =0,PF =1 9. 解:(1)段地址:2134H ; 偏移地址:10A0H ; 物理地址:223E0H (2)段地址:1FA0H ; 偏移地址:0A1F H ; 物理地址:2041FH (3)段地址:267A H ; 偏移地址:B876H ; 物理地址:32016H 11. 解:物理地址为: 0A7F0H ×10H +2B40H =A3330H 。 13. 答:指示存储器地址的寄存器有:SI ,DI ,BX ,BP
15. 解:偏移地址为5A238H -5200H ×10H =8238H ,因此当(CS )变成7800H 时,物理转
移地址为7800H ×10H +8238H =80238H
17.答:两组词汇和说明的关联关系为
(1)~O;(2)~D;(3)~C;(4)~B;(5)~A;(6)~E;
(7)~F;(8)~Q;(9)~N;(10)~M;(11)~L;(12)~H;
(13)~J;(14)~I;(15)~G;(16)~K;(17)~R;(18)~P。
第4章汇编语言程序设计基本方法
4.1例题
例4-1 写出下列变量的内容:
VAR1 DB 125,125/3, -1, -10H
VAR2 DW 125, 125/3, -1, -10H
VAR3 DB ‘AB’, ‘CD’
VAR4 DW ‘AB’, ‘CD’
解:按十六进制数依次写出各个变量的内容为:
VAR1:7D,29,FF,F0
VAR2:007D,0029,FFFF,FFF0
VAR3:41,42,43,44
VAR4:4142,4344
按内存存储顺序给出:
7D,29,FF,F0,7D,00,29,00,FF,FF,F0,FF,41,42,43,44,42,41,44,43
例4.2 设有下列伪指令:
START DB 1,2,3,4,’ABCD’
DB 3 DUP(?,1)
BUF DB 10 DUP (?),15
L EQU BUF-START
求L的值。
解:由EQU伪指令知,L的值为BUF的偏移地址减去START的偏移地址,而变量START 共占用8个字节,第2行定义的变量(无变量名)共占用6个字节,因此,L的值为8+6=14=0EH。
例4.3 在缓冲区DATABUF中保存有一组无符号数据(8位),其数据个数存放在DATABUF 的第1、2个字节中,要求编写程序将数据按递增顺序排列。(与教材p.114例4.3.10类似, 但方法不同)
解:这里采用双重循环实现数据的排序,这可使程序变得简单。
N=100 ;设有100个数据
STACK SEGMENT STACK ‘STACK’
DW 100H DUP(?)
TOP LABEL WORD
DATA SEGMENT
DATABUF DW N
DB N DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
; 取出随机数据
MOV CX,DATABUF
LEA SI,DATABUF+2
MOV BL,23
MOV AL,11
LP:
MOV [SI],AL
INC SI
ADD AL,BL
LOOP LP
; 数据排序
MOV CX,DATABUF
DEC CX
LEA SI,DATABUF+2
ADD SI,CX
LP1:
PUSH CX
PUSH SI
LP2:
MOV AL,[SI]
CMP AL,[SI-1]
JAE NOXCHG
XCHG AL,[SI-1]
MOV [SI],AL
NOXCHG:
DEC SI
LOOP LP2
POP SI
POP CX
LOOP LP1
MOV AH,4CH ;返回DOS
MOV AL,0
INT 21H
CODE ENDS
END START
例4-4 有一组数据(16位而进制数)存放在缓冲区BUF1中, 数据个数保存在BUF1的头两个字节中。要求编写程序实现在缓冲区中查找某一数据,如果缓冲区中没有该数据,则将它插入到缓冲区的最后;如果缓冲区中有多个被查找的数据,则只保留第一个,将其余的删除。
解:在缓冲区BUF中搜索指定的数据,当没有找到时,插入该数据;当找到时,进入搜索多余的重复数据,每找到一个就删除它(将缓冲区的剩余数据向前移动一个字)。当然应注意更新缓冲区的长度单元。
STACK SEGMENT STACK 'STACK'
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
;设缓冲区原有10个字,指定的数据为(NEW)=56AAH
DATA SEGMENT
BUF DW 10
DW 1000H,0025H,6730H,6758H,7344H,2023H,0025H,6745H,10A7H,0B612H
DW 10 DUP(?)
NEW DW 56AAH
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP ;搜索指定的数据
MOV CX,BUF
LEA SI,BUF+2
MOV AX,NEW
L1:
CMP AX,[SI]
JZ L2
.......INC SI
INC SI
LOOP L1 ;没有找到,则插入数据
MOV [SI],AX
INC BUF
JMP OK ;找到后,在剩余部分搜索重复的数据
L2:
DEC CX
INC SI
INC SI
L3:
CMP AX,[SI]
JZ L4
INC SI
INC SI
LOOP L3
JMP OK ;找到一个重复数据,则删除它
L4:
PUSH SI
DEC CX
PUSH CX
MOV DI,SI
INC SI
INC SI
CLD
REP MOVSW
DEC BUF
POP CX
POP SI
JMP L3 ;删除后,返回继续搜索重复的数据
OK:
MOV AH,4CH ;返回DOS
MOV AL,0
INT 21H
CODE ENDS
END START
例4.5 在缓冲区DAT1和DAT2中,存放着两组递增有序的8位二进制无符号数,其中前两个字节保存数组的长度,要求编程实现将它们合并成一组递增有序的数据DAT,DAT 的前两个字节仍用于保存数组长度。
解:这里要用到3个指针的使用。对于写指针首选使用DI,两个读指针可采用SI和BX,分别指示DAT1和DAT2。这样可适时使用字符串指令,以简化程序设计。
在设计中,将用BX指示的缓冲区DAT2内容读入AL,这样,当要将DAT1的内容传送到DAT时,可采用MOVSB指令;当要将DAT2的内容传送到DAT时,可采用STOSB指令。
STACK SEGMENT STACK 'STACK'
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS ;设DAT1中有10个数据,DAT2中有13个数据
DATA SEGMENT
DAT1 DW 10
DB 10H,25H,67H,68H,73H,83H,95H,0A8H,0C2H,0E6H
DAT2 DW 13
DB 05,12H,26H,45H,58H,65H,67H,70H,76H,88H,92H,0CDH,0DEH DAT DW ?
DB 200 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
MOV CX,DAT1
MOV DX,DAT2
MOV DAT,CX
ADD DAT,DX
LEA SI,DAT1+2
LEA BX,DAT2+2
LEA DI,DAT+2
CLD
L1:
MOV AL,[BX]
INC BX
L2:
CMP AL,[SI]
JB L3
MOVSB ;DAT1区中的数据传送到DAT区
DEC CX
JZ L4
JMP L2
L3:
STOSB ;DAT2区中的数据传送到DAT区
DEC DX
JZ L5
JMP L1
L4:
MOV SI,BX
DEC SI
MOV CX,DX
L5:
REP MOVSB
MOV AH,4CH ;返回DOS
MOV AL,0
INT 21H
CODE ENDS
END START
例4.6 已知缓冲区BUFA内有20个互不相等的整数(其序号从0到19),缓冲区BUFB 内有30个互不相等的整数(其序号从0到29)。编写程序完成:将既在BUFA中出现又在BUFB中出现的整数(设为x)存放在缓冲区BUFC中,并将x在BUFA和BUFB中的序号分别存放于缓冲区BUFCA和BUFCB中。
解:这里需要5个指针,但BUFC、BUFCA和BUFCB为同步操作,只需要一个指针,寻址方式为寄存器相对寻址,即(设AL为找到的值,DL、BL为序号)
MOV BUFC[DI],AL
MOV BUFCA[DI],DL
MOV BUFCB[DI],BL ;对序号也应小心处理,我们采用寄存器相对寻址,例如MOV AL,BUFA[SI],其中SI即为序号。
STACK SEGMENT STACK 'STACK'
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
N1=20
N2=30
DATA SEGMENT
BUFA DB 10H,25H,67H,26H,68H,73H,83H,58H,0,06H,12H,0CDH,95H
DB 0A8H,0C2H,48H,0E6H,0F1H,1AH,0F5H
BUFB DB 05,12H,26H,45H,53H,60H,6AH,7FH,76H,88H,92H,0C1H,0DEH,0E1H,0F5H
DB 09,17H,23H,48H,58H,65H,67H,70H,7CH,82H,96H,0CDH,0D1H,0F1H,0FEH
BUFC DB 20 DUP(?)
BUFCA DB 20 DUP(?)
BUFCB DB 20 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
;以BUFA为外循环,每个字节与BUFB的所有字节比较(构成内循环),
;以确定是否存在相同的值。
MOV CX,N1
XOR SI,SI
XOR DI,DI
L1:
MOV AL,BUFA[SI]
PUSH CX
MOV CX,N2
XOR BX,BX
L2:
CMP AL,BUFB[BX]
JZ L3
INC BX
LOOP L2
JMP L4
;找到相同的值后,进行值传送和序号保存。
L3:
MOV BUFC[DI],AL
MOV DX,SI
MOV BUFCA[DI],DL
MOV BUFCB[DI],BL
INC DI
L4:
POP CX
INC SI
LOOP L1
MOV AH,4CH ;返回DOS
MOV AL,0
INT 21H
CODE ENDS
END START
4.2习题
1.写出完成下列要求的变量定义语句:
(1)在变量var1中保存6个字变量:4512H,4512,-1,100/3,10H,65530;(2)在变量var2中保存字符串:’BYTE’, ’word’, ’WORD’;
(3)在缓冲区buf1中留出100个字节的存储空间;
(4)在缓冲区buf2中,保存5个字节的55H,再保存10个字节的240,并将这一过程重复7次;
(5)在变量var3中保存缓冲区buf1的长度;
(6)在变量pointer中保存变量var1和缓冲区buf1的偏移地址。
2.设变量var1的逻辑地址为0100:0000,画出下列语句定义的变量的存储分配图: var1 DB 12,-12,20/6,4 DUP(0,55H)
var2 DB ‘Assemble’
var3 DW ‘AB’, ‘cd’, ‘E’
var4 DW var2
var5 DD var2
3.指令正误判断,对正确指令写出源和目的操作数的寻址方式,对错误指令指出原因(设VAR1, VAR2为字变量, L1为标号):
(1)MOV SI,100 (2)MOV BX,VAR1[SI]
(3)MOV AX, [BX] (4)MOV AL, [DX]
(5)MOV BP, AL (6)MOV VAR1, VAR2
(7)MOV CS, AX (8)MOV DS, 0100H
(9)MOV [BX][SI], 1 (10)MOV AX, VAR1+VAR2
(11)ADD AX, LENGTH VAR1 (12)OR BL, TYPE VAR2
(13)SUB [DI], 78H (14)MOVS VAR1, VAR2
(15)PUSH 100H (16)POP CS
(17)XCHG AX, ES (18)MOV DS, CS
(19)JMP L1+5 (20)DIV AX, 10
(21)SHL BL, 2 (22)MOV AL, 15+23
(23)MUL CX (24)XCHG CL, [SI]
(25)ADC CS:[0100], AH (26)SBB VAR1-5,154
4.说明下列指令对的区别:
(1)MOV AX,VAR1 与 MOV AX,OFFSET VAR1
(2)MOV AX,VAR2 与 LEA AX,VAR2
(3)MOV AL,LENGTH VAR1 与 MOV AL,SIZE VAR1
(4)MOV AL,ES: [DI] CMP AL, [SI]
与 CMPSB
(5)SHR AL,1 与 SAR AL,1
(6)SHR AL,1 与 ROR AL,1
(7)ROL BX,1 与 RCL BX,1
5.写出下列转移指令的寻址方式(设L1为标号,VAR1为字型变量,DVAR1为双字型变量):
(1)JMP L1 (2)JMP NEAR L1
(3)JNZ L1 (4)JMP BX
(5)JG L1 (6)JMP VAR1[SI]
(7)JMP FAR PTR L1 (8)JMP DVAR1
6.设(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=3412H,(20102)=7856H,(21200)=4C2AH,(21202)=65B7H,求下列指令执行后AX寄存器的内容:(1)MOV AX,1200H;(2)MOV AX,BX;(3)MOV AX, [1200H];
(4)MOV AX, [BX]; (5)MOV AX,1100[BX];(6)MOV AX, [BX][SI];
(7)MOV AX,1100[BX][SI]
7.执行下列指令后,DX寄存器中的内容是多少?
TABLE DW 25,36,-1,-16,10000,13
PYL DW 7
……
MOV BX,OFFSET TABLE
ADD BX,PYL
MOV DX,[BX]
8.如果堆栈的起始地址为2200:0000,栈底为0100H,(SP)=00A8H,求
(1)栈顶地址;
(2)SS的内容;
(3)再存入数据5678H,3AF2H后,SP的内容。
9.设已用伪指令EQU定义了4个标识符:
N1 EQU 2100
N2 EQU 10
N3 EQU 20000
N4 EQU 25000
下列指令是否正确?并说明原因。
(1)ADD AL,N1-N2;(2)MOV AX,N3+N4;
(3)SUB BX,N4-N3;(4)SUB AH,N4-N3-N1;
(5)ADD AL,N2;(6)MOV AH,N2*N2
10.按下列要求写出指令:
(1)将AX寄存器的低4位清零,其余位不变;
(2)将BX寄存器的低4位置1,其余位不变;
(3)将AL寄存器的低4位保持不变,高4位取反;
(4)测试BX中的位1和位2,当这两位同时为0时将AL置0FFH,否则AL清零;(5)测试BX中的位1和位2,当这两位有一位为0时将AL置0FFH,否则AL清零;(6)将AL中保存的字母ASCII码变换成相应的大写字母的ASCII码;
(7)将AL中保存的字母ASCII码变换成相应的小写字母的ASCII码;
(8)将AX中的各位取反;
(9)将DX中的低7位取反,高9位不变;
(10)将CX中的低8位与高8位互换。
11.写出完成下述功能的程序段:
(1)传送40H到AL寄存器;
(2)将AL的内容乘以2;
(3)传送16H到AH寄存器;
(4)AL的内容加上AH的内容。
计算最后结果(AL)=?
12.写出完成下述功能的程序段:
(1)从缓冲区BUF的0004偏移地址处传送一个字到AX寄存器;
(2)将AX寄存器的内容右移2位;
(3)将AX内容与BUF的0006偏移地址处的一个字相乘;
(4)相乘结果存入BUF的0020H偏移地址处(低位在前)。
13.设(BX)=11001011B,变量VAR的内容为00110010B,求下列指令单独执行后BX 的内容:
(1)XOR BX,VAR;(2)AND BX,VAR;
(3)OR BX,VAR;(4)XOR BX,11110000B;
(5)AND BX,00001111B;(6)TEST BX,1。
14.设(DX)=10111011B,(CL)=3,(CF)=1,求下列指令单独执行后DX的内容:
(1)SHR DX,1;(2)SAR DX,CL;(3)SHL DX,CL;
(4)SHL DX,1;(5)ROR DX,CL;(6)ROL DL,CL;
(7)SAL DH,1;(8)RCL DX,CL;(9)RCR DL,1
15.选择题(各小题只有一个正确答案)
(1)执行下列三条指令后:
MOV SP,1000H
PUSH AX
CALL BX
a. (SP)=1000H;
b. (SP)=0FFEH;
c. (SP)=1004H;
d. (SP)=0FFCH;
(2)要检查寄存器AL中的内容是否与AH相同,应使用的指令为:
a. AND AL, AH
b. OR AL, AH
c. XOR AL, AH
d. SBB AL, AH
(3)指令JMP NEAR PTR L1与CALL L1(L1为标号)的区别在于:
a. 寻址方式不同;
b. 是否保存IP的内容;
c. 目的地址不同;
d. 对标志位的影响不同。
16.寄存器DX:AX组成32位数,DX为高位,编写程序段实现:
(1)DX:AX右移3位,并将移出的低3位保存在CL中;
(2)DX:AX左移3位,并将移出的高3位保存在CL中;
√17.已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。
18.利用移位、传送和相加指令实现AX的内容扩大10倍。
19.在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。
√20.编写程序段实现将BL中的每一位重复4次,构成32位的双字DX:AX,例如当BL=01011101B时,得到的(DX)=0F0FH,(AX)=0FF0FH。
21.编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=10110110 10011001B。
22.在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:
(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;
(2)当两数均为奇数时,两个变量的内容不变;
(3)当两数均为偶数时,两数缩小一倍后存入原处。
23.已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写
程序段找出这个错码,并将它送AX,其地址送SI;如果3个代码都相同,则在AX中置-1标志。
24.分析下列程序段的功能:
MOV CL,04
SHL DX,CL
MOV BL,AH
SHL AX,CL
SHR BL,CL
OR DL,BL
25.下列程序段执行后,求BX寄存器的内容:
MOV CL,3
MOV BX,0B7H
ROL BX,1
ROR BX,CL
26.下列程序段执行后,求BX寄存器的内容:
MOV CL,5
MOV BX,7D5CH
SHR BX,CL
27.设数组ARRAY的第1个字节存放数组的长度(<256),从第2个字节开始存放无符
号8位数,求数组元素之和(结果放在AX中)。如果计算的和超出16位数的范围,则给出溢出标志DX=-1。
28.设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX)
和最大值(存入DX)。
29.设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其
中的0元素抹去,并更新其长度。
30.编写程序实现N个字乘以或除以1个字,设BUFN存放N个字,BUF1存放乘数或除
数,PRODUCT存放乘积,QUOTIENT存放商,REMAINDER存放余数。
31.编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1
个数相等的元素个数。
32.设有n(设为17)个人围坐在圆桌周围,按顺时针给他们编号(1,2,…,n),从
第1个人开始按顺时针方向加1报数,当报数到m(设为11)时,该人出列,余下的人继续进行,直到所有人出列为止。编写程序模拟这一过程,求出出列人的编号顺序。
33.编写子程序实现以十六进制数在屏幕上显示AL的内容。
34.从键盘上读入一个正整数N(0≤N≤65535),转换成十六进制数存入AX,并在屏
幕上显示出来。
35.在缓冲区BUFFER中,第1个字节存放数组的长度(<256),从第2个字节开始存
放字符的ASCII码,编写子程序完成在最高位给字符加上偶校验。
36. 编写程序完成求多位数(N 个字)的绝对值。 37. 已知斐波那契数列的定义为:)
3(,1,12
121≥+===--i F F F F F i i i ,编写
求该数列前n 项的子程序。
38. 编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM10。 39. 编写程序实现将包含20个数据的数组ARRAY 分成两个数组:正数数组ARRAYP 和负数数组ARRAYN ,并分别将这两个数组中数据的个数显示出来。
40. 编写程序实现求缓冲区BUFFER100个字中的最小偶数(存入AX )。
41. 编写程序实现求级数 ++++2
2
2
21n 的前n 项和刚大于2000的项数n 。 42. 已知数组A 中包含有15个互不相等的整数,数组B 中包含有20个互不相等的整数,编写程序实现将既在数组A 中出现又在数组B 中出现的整数存放于数组C 中。
43. 定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES 或DS 的功能。 44. 定义一条宏指令,实现从键盘中输入一个字符串(利用INT 21H 的09号功能)。 45. 定义一条宏指令,实现在屏幕上显示出指定的字符串。 46. 定义一条宏指令,实现在屏幕上输出回车、换行。 47. 利用其它指令完成与下列指令一样的功能: (1)REP MOVSB ; (2)REP LODSB ; (3)REP STOSB ; (4)REP SCASB 。 48. 设在数据段中定义了:
STR1 DB ‘ASSEMBLE LANGUAGE ’ STR2 DB 20 DUP(?) 利用字符串指令编写程序段实现:
(1)从左到右将STR1中的字符串传送到STR2; (2)从右到左将STR1中的字符串传送到STR2; (3)将STR1中的第6个和第7个字节装入DX ;
(4)扫描STR1字符串中有无空格,如有则将第一个空格符的地址传送到SI 。 49. 设在数据段中定义了:
STRING DB ‘Today is Sunday & July 16, 2000’ 编写程序实现将STRING 中的’&’用’/’代替。 50. 分析下列程序段完成的功能: MOV CX ,100 LEA SI ,FIRST LEA DI ,SECOND REP MOVSB
51. 分析下列程序段:
LEA DI ,STRING MOV CX ,200 CLD
MOV AL,20H
REPZ SCASB
JNZ FOUND
JMP NOT_FOUND
问:转移到FOUND的条件。
52.设在数据段的变量OLDS和NEWS中保存有5个字节的字符串,如果OLDS字符串不同于
NEWS字符串,则执行NEW_LESS,否则顺序执行程序。
53.编程实现将STRING字符串中的小写字母变换成大写字母。
54.设在数据段中定义了:
STUDENT_NAME DB 30 DUP(?)
STUDENT_ADDR DB 9 DUP(?)
STUDENT_PRINT DB 50 DUP(?)
编写程序实现:
(1)用空格符清除缓冲区STUDENT_PRINT;
(2)在STUDENT_ADDR中查找第一个’_’字符;
(3)在STUDENT_ADDR中查找最后一个’_’字符;
(4)如果STUDENT_NAME中全为空格符,则STUDENT_PRINT全存入’*’;
(5)将STUDENT_NAME传送到STUDENT_PRINT的前30个字节中,将STUDENT_ADDR
传送到STUDENT_PRINT的后9个字节中。
55.在DS:X_BUF为起始地址的表中存有按由小到大顺序排列的一组16位无符号数,其中
该表的第一、二两字节存放数据个数。现在DS:X_KEY中存有一个关键字(16位无符号数),要求从上述表中查找第一个此关键字,若找到此关键字,则DI中存放该关键字在该表中的偏移量;若无此关键字,则将该关键字插入X_BUF表中,使该表依然有序,并将该关键字在表中的偏移量存放在DI中。
56.分析下列子程序FUNC1,并回答相应的问题。
FUNC1 PROC NEAR
XOR CX,CX
MOV DX,01
MOV CL,X
JCXZ A20
INC DX
INC DX
DEC CX
JCXZ A20
A10: MOV AX,02
SHL AX,CL
ADD DX,AX
LOOP A10
A20: MOV Y,DX
RET
FUNC1 ENDP