微机原理黄冰版--作业答案

更新时间:2023-09-10 04:14:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1章 绪论

1.2 用8位二进制码,写出下列十进制数的原码和补码表示 解释:

原码:最高位为符号位,正数符号位为0,负数符号位为1。

补码:正数的补码与原码相同;负数的补码:由其原码除符号位保持不变外,其余各位按位取反,末位加1而成。 解:

(1) [+65]原 = 0100 0001B 注:65 = 64 + 1

[+65]补 = [+65]原 = 0100 0001B 注:正数补码与原码相同 (2) [+115]原 = 0111 0011B 注:115 = 64 + 32 + 16 + 2 + 1 [+115]补 = [+115]原 = 0111 0011B 注:正数补码与原码相同 (3) [-65]原 = 1100 0001B 注:65 = 64 + 1

[-65]补 = 1011 1110B + 1B = 1011 1111B 注:除符号位外,按位取反,末位加1 (4) [-115]原 = 1111 0011B 注:115 = 64 + 32 + 16 + 2 + 1 [-115]补 = 1000 1100B + 1B = 1000 1101B 注:除符号位外,按位取反,末位加1 1.3 用16位二进制码,写出下列十进制数的原码和补码表示。

(1) [+120]原 = 0000 0000 0111 1000B 注:120 = 64 + 32 + 16 + 8 [+120]补 = [+120]原 = 0000 0000 0111 1000B 注:正数补码与原码相同 (2) [-120]原 = 1000 0000 0111 1000B 注:120 = 64 + 32 + 16 + 8 [-120]补 = 1111 1111 1000 0111B + 1B = 1111 1111 1000 1000B 注:除符号位外,按位取反,末位加1

(3) [+230]原 = 0000 0000 1110 0110B 注:230 = 128 + 64 + 32 + 4 + 2 [+230]补 = 0000 0000 1110 0110B 注:正数补码与原码相同 (4) [-230]原 = 1000 0000 1110 0110B 注:230 = 128 + 64 + 32 + 4 + 2 [-230]补 = 1111 1111 0001 1001B + 1B = 1111 1111 0001 1010B 注:除符号位外,按位取反,末位加1 1.4 写出下列用补码表示的二进制数的真值。 解释:

正数的补码 = 原码

负数的补码:再次求补码得到其原码 解:

(1) 0011 0111 正数的补码 真值:32 + 16 + 4 + 2 + 1 = +55 (2) 0101 1001 正数的补码 真值:64 + 16 + 8 + 1 = +89

(3) 1000 1101 负数的补码 真值:1111 0010B + 1B = 1111 0011B = -115 (4) 1111 1001 负数的补码 真值:1000 0110B + 1B = 1000 0111B = -7

第2章 Intel 8086微处理器

2.2 在存储器中存放的数据如图所示。试读出75422H和75424H字节单元的内容是什么?读出75422H和75424H字单元的内容是什么? 解:

75422H字节单元的内容:9CH 75424H字节单元的内容:5DH 75422H字单元的内容:249CH 75424H字单元的内容:0E65DH

2.3 段地址和偏移地址为1000H:117AH的存储单元的物理地址是什么?而1109H:00EAH或1025H:0F2AH的存储单元的物理地址又是什么?这说明了什么问题? 解释:物理地址 = 段地址 × 10H + 偏移地址 解:

1000H : 117AH存储单元的物理地址1000H × 10H + 117AH = 1117AH 1109H : 00EAH存储单元的物理地址1109H × 10H + 00EAH = 1117AH 1025H : 0F2AH存储单元的物理地址1025H × 10H + 0F2AH = 1117AH

说明:不同的段地址不同的偏移地址可以指向同一个物理地址,即各个逻辑段可以相互重叠。

2.4 在存储器分段结构中,每个段区最大可占用多少地址范围,为什么?如果在8086的机器中,若段间不允许重叠,那么最多可分多少个段区? 解:

若为8086微处理器,每个段区最大可占用64KB,因为所有内部寄存器都只有16位。 若每段64KB,最多可分16个段区,因为8086微处理器有20条地址线,可访问存储器的最大容量为1MB。

2.5 如果从存储器的2000H地址开始分配段区,要求数据段占用1KB范围,堆栈段占用512B范围,代码段占用8KB范围。按数据段、堆栈段和代码段的顺序连续存放,试画出存储器分段地址分配示意图,图中应写明各段寄存器的内容? 解:

02000H 02400H 02600H

注:

1KB 512B 8KB DS:0200 SS:0240H CS:0260H

7542 0H 1H 2H 3H 4H 5H 存储器 ? 13H 78H 9CH 24H 5DH E6H 1KB:00 0000 0000B~11 1111 1111B

SS:起始物理地址2000H + 1KB = 2000H + 400H = 02400H 512B:0 0000 0000B~1 1111 1111B

CS:起始物理地址2400H + 512B = 2400H + 200H = 02600H 2.6 指出下列指令的源和目标操作数的寻址方式: 题号 指令 MOV ARRAY,BX ADC CX,ALPHA[BX][SI] 目的操作数的寻址方式 直接寻址 寄存器寻址 源操作数的寻址方式 寄存器寻址 带位移的基址变址寻址 立即寻址 寄存器寻址 寄存器间接寻址 (1) (2) (3) (4) (5) (6) AND GAMMA[DI],11011000B 带位移的变址寻址 INC BL TEST ES:[SI],DX SBB SI,[BP] 寄存器寻址 寄存器间接寻址 寄存器寻址 2.7 现有DS=2000H,BX=0100H,SI=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各指令执行完后AX寄存器的内容。 题号 指令 MOV AX,1200H MOV AX,BX MOV AX,[1200H] MOV AX,[BX] MOV AX,1100H[BX] MOV AX,[BX][SI] AX寄存器的内容 1200H 0100H 4C2AH 3412H 4C2AH 7856H 简单解释 立即数赋给AX 寄存器BX值赋给AX PA=DS×16+1200H=21200H PA=DS×16+BX=20100H PA=DS×16+BX+1100H=21200H PA=DS×16+BX+SI=20102H PA=DS×16+BX+SI+1100H=21202H (1) (2) (3) (4) (5) (6) (7) MOV AX,1100H[BX][SI] 65B7H 2.8 假定DS=2000H,ES=2100H,SS=1500H,SI=00A0H,BX=0100H,BP=0010H,数据段中变量名VAL的偏移地址值为0050H,试指出下面源操作数字段的寻址方式是什么?其物理地址值是多少? 题号 指令 源操作数的寻址方式 立即寻址 寄存器寻址 直接寻址 寄存器间接寻址 寄存器间接寻址 带位移的基址寻址 基址变址寻址 直接寻址 源操作数的物理地址 在代码段中,与CS、IP有关 在寄存器中 DS×16+100H=20100H DS×16+BX=20100H SS×16+BP =15010H DS×16+BX +10=2010AH DS×16+BX +SI=201A0H DS×16+VAL=20050H (1) (2) (3) (4) (5) (6) (7) (8) MOV AX, 00ABH MOV AX,BX MOV AX,[100H] MOV AX,[BX] MOV AX,[BP] MOV AX,[BX+10] MOV AX,[BX][SI] MOV AX,VAL (9) MOV AX,ES:[BX] 寄存器间接寻址 寄存器间接寻址 带位移的基址寻址 ES×16+BX=21100H DS×16+SI=200A0H DS×16+BX+VAL=20150H (10) MOV AX,[SI] (11) MOV AX,VAL[BX] (12) MOV AX,VAL[BX][SI] 带位移的基址变址寻址 DS×16+BX+SI+VAL=201F0H 2.9 设AX=1122H,BX=3344H,CX=5566H,SP=2000H,试分析下列程序段执行后,AX、BX、CX、SP中的内容各为多少?并画出堆栈变化示意图。 解:

第1条指令 PUSH AX

第2条指令 PUSH BX

第3条指令 PUSH CX

第4条指令 POP AX

第5条指令 POP CX

AX=1122H BX=3344H SP→ 22H CX=5566H

11H SP=1FFEH

SP→ 44H AX=1122H 33H BX=3344H 22H CX=5566H

11H SP=1FFCH

SP→ 66H 55H

44H AX=1122H 33H BX=3344H 22H CX=5566H

11H SP=1FFAH

SP→ 44H AX=5566H 33H BX=3344H 22H CX=5566H

11H SP=1FFCH

AX=5566H BX=3344H SP→ 22H CX=3344H

11H SP=1FFEH

2.10 下列程序段中每一条指令执行完后,AX中的十六位进制内容是什么? 指令 MOV AX,0 DEC AX ADD AX,7FFFFH ADD AX,2 NOT AX SUB AX,0FFFFH ADD AX,8000H OR AX,0BFDFH AX中的内容 AX=0000H AX=0FFFFH AX=7FFEH AX=8000H AX=7FFFH AX=8000H AX=0000H AX=0BFDFH 指令 1100 1101 1010 1011算术左移 AND AX,0EBEDH AX=0ABCDH XCHG AH,AL SAL AX,1 RCL AX,1 AX=0CDABH AX=9B56H (CF=1,PF=1) AX=36ADH (CF=1,PF=1,OF=1) 1001 1011 0101 0110带进位循环左移 循环移位指令不影响除CF和OF以外的其他条件标志。

移位指令根据移位后的结果设置SF、ZF和PF位,AF位则无定义。 RCL:OF=1最高有效位的值发生变化;PF保留原来的值;

2.11 将十六进制数62A0H与下列各个数相加,试给出和数及标志位AF,SF,ZF,CF,OF和PF的状态。 (1) 9D60H

0110?10011000000101010110100000110000000000000 0000和数:0H

AF=0,SF=0,ZF=1,CF=1,OF=0,PF=1 (2) 4321H

0110?01000101000101010001100100101110000000001 0001和数:0A5C1H

AF=0,SF=1,ZF=0,CF=0,OF=1,PF=0

2.12 从下列各个数中减去4AE0H,试给出差值及标志位AF,SF,ZF,CF,OF和PF的状态。

(1)1234H (2)9090H 解:

Z DW 2 DUP (?) r db ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV AL, W

SUB AL, X ; W - X -> AL CBW

MOV BL, 10

IDIV BL ; (W - X) / 10 -> AL MOV r, AH ; (W - X) % 10 -> r MOV BL, Y

IMUL BL ; (W - X) / 10 * Y -> AX MOV BX, AX

IMUL BX ; ((W - X) / 10 * Y)^2 -> DX, AX MOV Z, AX

MOV Z+2, DX ; ((W - X) / 10 * Y)^2 -> Z MOV AH, 4CH INT 21H CODE ENDS END START

3.13 在数组字变量ARRAY中有10个数据,将数组中的第5个字数据求补,再放回原处,画出程序流程图和编写程序。

3.14 用重复前缀串比较指令比较两个字符串,一个是在数据段的字符串变量STR1(内容为'THIS IS A DOG'),另一个是在附加段的字符串变量STR2(内容为'THIS IS A COCK')。当比较到第一个不相同的字符时停止比较,把相同部分字符串长度存入数据段的字节变量NUM中。写出分段结构的程序段,应包括段定义,伪指令和指令序列。问:相同部分字符串长度为多少?在STR1和STR2第一个不同处的偏移地址是多少?

DATA SEGMENT

STR1 DB 'THIS IS A DOG' LEN1 DB $-STR1 NUM DB ? DATA ENDS

EDATA SEGMENT

STR2 DB 'THIS IS A COCK' LEN2 DB $-STR2 EDATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:EDATA START: MOV AX,DATA MOV DS,AX MOV AX,EDATA MOV ES,AX CLD ;串操作由低地址向高地址 MOV CH,0 MOV AL,LEN1 CMP AL,ES:LEN2 JB B1L2

MOV CL,ES:LEN2 JMP CMPOK B1L2: MOV CL,AL

CMPOK: LEA SI,STR1 LEA DI,ES:STR2 REPE CMPSB MOV AX,SI

DEC AL ;不同处的字节偏移地址

MOV NUM,AL ;不同处的字节偏移地址放到NUM MOV AH, 4CH INT 21H CODE ENDS END START

答:相同长度10,不同处的偏移地址10

3.15 有两个压缩型BCD码相加,被加数(6756)和加数(7321)存放在数据段的BUFFER变量的4个连续的字节存储单元中,结果(和)存放在RESUT变量的三个字单元中(考虑到有进位的情况),编制具有数据段和代码段结构的完整程序,程序中需要作必要的注释。

注:结果存放在RESUT字节变量中,三个字单元不知要求怎么用 DATA SEGMENT

BUFFER DB 67H,56H,73H,21H RESUT DB 3 DUP (?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,BUFFER+1 ;第一个数据低两位->AL MOV BL,BUFFER+3 ;第二个数据低两位->BL ADD AL,BL ;低两位相加 DAA ;十进制调整 MOV DL,AL ;低两位相加结果放到DL MOV AL,BUFFER ;第一个数据高两位->AL MOV BL,BUFFER+2 ;第二个数据高两位->BL ADC AL,BL ;低两位相加 DAA ;十进制调整 MOV BL,0 JNC HCF INC BL

HCF: MOV RESUT,BL ;存放最高位 MOV RESUT+1,AL ;存放中间两位 MOV RESUT+2,DL ;存放最低两位 MOV AH, 4CH INT 21H CODE ENDS END START

3.16 将SRCBUF变量定义的80个字符串传送到DSTBUF变量定义的存储区去。当遇到0DH时,不将此字符传送到DSTBUF变量中去。试编写程序,并加以注释。

DATA SEGMENT

SRCBUF DB 'aaa',0DH,'bbb' DSTBUF DB 80 DUP (?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,07 ;比较次数->CX MOV SI,0 ;源串指针->SI

MOV DI,0 ;目标串指针->DI SDCMP: MOV AL,SRCBUF[SI] CMP AL,0DH JZ NSEND

MOV DSTBUF[DI],AL ;不等于0DH,保存数据,修改SI、DI INC DI

NSEND: INC SI ;等于0DH,不保存数据,修改SI LOOP SDCMP MOV AH, 4CH INT 21H CODE ENDS END START

3.17 已知有n个元素存放在以BUF为首址的字节存储区中,试统计其中负元素的个数,画出程序框图,编写程序。

DATA SEGMENT

BUF DB 92H,12H,0F3H,23H,87H LEN EQU $-BUF DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ;比较次数->CX MOV SI,0 ;字节存储区指针 MOV DL,0 ;负元素个数初始化 NEGCMP: MOV AL,BUF[SI] CMP AL,0 JNL C0GE

INC DL ;小于0,个数加1,指针加1 C0GE: INC SI ;不小于0,指针加1 LOOP NEGCMP MOV AH, 4CH INT 21H CODE ENDS END START

3.18 已知以BUF为首址的字存储区中存放着n个有符号的二进制数,试编写程序,将大于等于0的数送以BUF1为首址的字存储区中,将小于0的数送以BUF2为首址的字存储区中,并画出程序框图。

DATA SEGMENT

BUF DW 1212H,0FF12H,3434H,8989H,5656H,9090H LEN EQU ($ - BUF) / 2 BUF1 DW LEN DUP (?) BUF2 DW LEN DUP (?) DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ;循环次数,即BUF的单元数 MOV BX,0 ;BUF指针初始化 MOV SI,0 ;BUF1指针初始化 MOV DI,0 ;BUF2指针初始化 CLOOP: MOV AX,[BX] ;BUF数据->AX CMP AX,0 JGE TO1

MOV BUF2[DI],AX ;AX<0,AX->BUF2,DI+2->DI,BX+2->BX INC DI

INC DI

JMP CONTINUE

TO1: MOV BUF1[SI],AX ;AX>=0,AX->BUF1,SI+2->SI,BX+2->BX INC SI INC SI CONTINUE:INC BX INC BX

LOOP CLOOP MOV AH, 4CH INT 21H CODE ENDS END START

3.19 已知在以BUF为首地址的字节存储区中,存放着一个以′$′作结束标志的字符串,试编写程序,在CRT上显示该字符串,并要求将小写字母以大写字母形式显示出来。画出程序框图。

DATA SEGMENT

BUF DB 'abCDalskdjf$' DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,0 ;BUF地址指针 ALOOP: MOV DL,BUF[SI] ;BUF数据->DL CMP DL,'$' ;DL='$',EXIT JE STOP CMP DL,5AH

JBE UPPER ;大写字母,打印输出,地址指针SI加1

SUB DL,20H ;小写字母,DL减20H后打印输出,地址指针SI加1 UPPER: MOV AH,02H INT 21H INC SI

JMP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.20 设有三个字节变量X、Y、Z,试找出X、Y有符号数中较大者送入Z中,编写程序。

推荐检测实例:-128和127 DATA SEGMENT X DB 0F0H Y DB 12H Z DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,X ;X->AL CMP AL,Y ;X ? Y JGE NEXT ;X>=Y,X->Z MOV AL,Y ;XZ NEXT: MOV Z,AL MOV AH, 4CH INT 21H CODE ENDS

END START

3.21 设在变量单元A、B和C中存放有三个数,若三个数都不为0,则求出三个数之和存入D中;若有一个为0,则将其他两个单元也清零,编写程序。

DATA SEGMENT A DB 0F0H B DB 12H C DB 22H D DW ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CMP A,0 JZ STOP CMP B,0 JZ STOP CMP C,0 JZ STOP ;有一个为0,全部置0 MOV AH,0 ;否则作加法运算,放到D,注意加法运算结果为字 MOV BH,0 MOV AL,A MOV BL,B ADD AX,BX MOV BL,C ADD AX,BX MOV D,AX JMP STOP NEXT: MOV A,0 MOV B,0 MOV C,0 STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.22 试分析下列程序段,说明完成了什么操作?程序执行前后HEXNUM字节单元的内容是什么?

ASCNUM DB 41H HEXNUM DB ?

MOV AH,ASCNUM CMP AH,39H JBE NEXT SUB AH,7

NEXT:SUB AH,30H

MOV HEXNUM,AX HLT 解:

'0'~'9'与'A'~'F'组成的一位十六进制数的ASCII码转换为一位十六进制数。 程序执行前:[HEXNUM] = ? 程序执行后:[HEXNUM] = 0AH

3.23 在数据区STR1单元开始存放一长度为1~256个字符的字符串。要求对该字符串中每个字符在最高位配上一个偶校验位(即保持一字节数中1的个数为偶数),并存回到原单元中。

DATA SEGMENT

STR1 DB 'abcdefghi' LEN1 EQU $-STR1 DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN1 MOV SI,0

ALOOP: MOV AL,STR1[SI]

OR AL,0 ;与0相或,不影响原来的值

JP CONTINUE ;若1的个数为偶数,不做任何处理 OR AL,80H ; 若1的个数为偶数,最高位置1 MOV STR1[SI],AL CONTINUE:INC SI

LOOP ALOOP STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.24 已知在数据区中DATA1和DATA2开始分别存放N个字节数据,编制程序检查两数据块中的数据是否相同。若完全一致,则将标志单元FLAG置FFH,否则置0。并将第一次出现的不同数据的地址分别存放ADR1和ADR2单元中,编写程序。

;假设为按顺序比较,非无序比较 DATA SEGMENT

DATA1 DB 22H,33H,44H,55H DATA2 DB 22H,33H,44H,66H N EQU $-DATA2 FLAG DB ? ADR1 DW ? ADR2 DW ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,N MOV SI,0 MOV DI,0

ALOOP1: MOV AL,DATA1[SI] CMP AL,DATA2[DI] JNZ NE12 INC SI INC DI

LOOP ALOOP1 MOV FLAG,0FFH

JMP EXIT NE12: MOV FLAG,0 MOV ADR1,SI MOV ADR2,DI EXIT: MOV AH, 4CH INT 21H

CODE ENDS END START

3.25 定义一数组GRADE存放有100个学生某门功课的考试成绩,要求编一程序,统计各分数段的人数,即要求统计90~100分,80~89分,70~79分,60~69分以及60分以下的各有多少人。

DATA SEGMENT

GRADE DB 12,65,77,88,98,23,94,75,85,62 LEN EQU $-GRADE A DB 0 B DB 0 C DB 0 D DB 0 E DB 0 DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,LEN ALOOP1: MOV SI,CX DEC SI

CMP GRADE[SI],60

JB GRE ;<60, E+1->E CMP GRADE[SI],70

JB GRD ;<70, D+1->D CMP GRADE[SI],80

JB GRC ;<80, C+1->C CMP GRADE[SI],90

JB GRB ;<90, B+1->B INC A ;>=90, A+1->A JMP GOON GRB: INC B

JMP GOON GRC: INC C

JMP GOON GRD: INC D

JMP GOON GRE: INC E

JMP GOON GOON: LOOP ALOOP1 MOV AH, 4CH INT 21H CODE ENDS END START

3.26 编一程序,在以BUF为首址的字节单元中存放了COUNT个无符号数,找出其中最大数送MAX单元。

DATA SEGMENT

BUF DB 11,23,43,45,67,82,38,48,98,34,67 COUNT EQU $-BUF MAX DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,COUNT MOV AL,0 ;AL用力存放最大数,初值为0

ALOOP: MOV SI,CX DEC SI

CMP AL,BUF[SI] ;从后面取数据,与AL比较 JAE GOON

MOV AL,BUF[SI]

GOON: LOOP ALOOP MOV MAX,AL MOV AH, 4CH INT 21H CODE ENDS END START

3.27 利用系统功能调用从键盘输入10个一位无符号数,求出其中最大和最小数,在显示器上输出显示。

DATA SEGMENT

IN_STR DB 'Please Input 10 Num of 0~9:$' MAX_STR DB 0DH,0AH,'MAX Num is:$' MIN_STR DB 0DH,0AH,'MIN Num is:$' MAX DB ? MIN DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA DX,IN_STR MOV AH,09H

INT 21H ;提示输入10个数字 IND: MOV AH,01H

INT 21H ;输入一个字符 CMP AL,30H

JB IND ;<30H,ERROR CMP AL,39H

JA IND ;>39H,ERROR SUB AL,30H

MOV MIN,AL ;第一个数初始化MIN MOV MAX,AL ;第一个数初始化MAX MOV CX,3 ALOOP: MOV AH,01H

INT 21H ;输入一个字符 CMP AL,30H

JB ALOOP ;<30H,ERROR CMP AL,39H

JA ALOOP ;>39H,ERROR SUB AL,30H ;ASCII->数 CMP AL,MIN

JB GOMIN ;小于最小数,AL->MIN,输入下一个数 CMP AL,MAX

JA GOMAX ;大于最大数,AL->MAX,输入下一个数 JMP GOON GOMIN: MOV MIN,AL JMP GOON

GOMAX: MOV MAX,AL

GOON: LOOP ALOOP LEA DX,MAX_STR MOV AH,09H

INT 21H ;提示输出最大数 MOV DL,MAX ADD DL,30H MOV AH,02H

INT 21H ;输出最大数 LEA DX,MIN_STR MOV AH,09H

INT 21H ;提示输出最小数 MOV DL,MIN ADD DL,30H MOV AH,02H

INT 21H ;输出最小数 MOV AH, 4CH INT 21H CODE ENDS END START

3.28 利用系统功能调用,完成将键盘输入的小写字母转换成大写字母输出显示,直到输入$字符时,停止输出。

CODE SEGMENT ASSUME CS:CODE START: MOV AH,01H

INT 21H ;输入一个字符 CMP AL,'$'

JE STOP ;'$'符,退出 CMP AL,'a' JB START CMP AL,'z' JA START ;非小写字母,继续输入 SUB AL,20H MOV DL,AL MOV AH,02H INT 21H ;小写字母转换成大写字母输出 JMP START STOP: MOV AH, 4CH INT 21H CODE ENDS END START

3.29 设有一字符串已存放在STRBUF为首址的数据区中,编一程序找出其中的$字符,并将其存放地址送ADRBUF单元中。

DATA SEGMENT

STRBUF DB 'a;sldkfjasldkf$asdf' LEN EQU $-STRBUF ADRBUF DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX

MOV CX,LEN ;最多查询次数 MOV BX,0

ALOOP: CMP STRBUF[BX],'$'

JZ STOP ;找到,地址送ADRBUF,退出程序 INC BX

LOOP ALOOP STOP: MOV ADRBUF,BL MOV AH, 4CH INT 21H CODE ENDS END START

3.30 用子程序结构编程计算:S=1!+2!+3!+4!+?+8! 修改原有答案结果,SUM2为结果

STACK SEGMENT STACK DW 256 DUP(?) TOP LABEL WORD STACK ENDS

DATA SEGMENT BUFF DB 1,2,3,4,5,6,7,8 SUM DW 0000H SUM2 DW 0 DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX

MOV SP,OFFSET TOP MOV CH,0 MOV CL,8

MOV SI,OFFSET BUFF LOP1:

MOV AX,OFFSET SUM PUSH AX MOV AH,0 MOV AL, [SI] PUSH AX

CALL FAR PTR FACT MOV DX,SUM ADD SUM2,DX INC SI

LOOP LOP1 MOV AH,4CH INT 21H CODE ENDS

CODES SEGMENT ASSUME CS:CODES FACT PROC FAR PUSH BP MOV BP,SP PUSH BX PUSH AX

MOV BX,[BP+8] MOV AX,[BP+6] CMP AX,0 JE DONE PUSH BX DEC AX PUSH AX CALL FACT MOV BX,[BP+8] MOV AX,[BX]

MUL WORD PTR [BP+6] JMP RETURN

DONE: MOV AX,01H RETURN:MOV [BX],AX POP AX POP BX POP BP

17.ADC0809和8255A连接如图8.81所示。8255A的A口工作于方式1输入。当ADC0809转换结束时,EOC的上升沿触发单稳态电路DW,DW输出的负脉冲作为选通脉冲,将ADC0809的输出数据锁存进A口。用中断方式依次将IN7~IN0采样一遍,放到BUFFER开始的数据缓冲区,试编程。设8255A口地址为200H~203H,8259的地址为020H、021H,IRQ2中断类型号为0AH,8259已初始化。

图8.81 解:

8255的PC7为1输出启动信号,PC0~PC2实现通道选择,A/D转换结束信号可从PC4获得,PC3为1输出中断。 ;主程序

STACK SEGMENT STACK STA DB 20 DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT

BUFFER DB 8 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX

MOV SP,OFFSET TOP

PUSH DS ;中断向量送中断向量表 MOV AX,SEG ADINT MOV DS,AX

MOV DX,OFFSET ADINT MOV AL,0AH MOV AH,25H INT 21H

POP DS

MOV DX,021H ;开放IRQ2中断 IN AL,DX

AND AL,1111 10llB OUT DX,AL

MOV DI,OFFSET BUFFER ;缓冲区起始地址送DI STD ;DF置1

STI ;开中断 MOV CX,8 MOV BL,90H

NEXT:MOV DX,202H

MOV AL,BL

OUT DX,AL ;启动0809 AND AL,7FH OUT DX,AL

WAIT:IN AL,DX TEST AL,10H

JNZ WAIT ;检测PC4状态,非0,A/D转换没结束 MOV AL,07H MOV DX,203H

OUT DX,AL ;PC3置1,输出中断 HLT

INC BL LOOP NEXT

CLI ;采集完8口,结束 MOV AH,4CH INT 2IH ;中断服务程序

ADINT PROC NEAR

PUSH DX

MOV DX,200

IN AL,DX ;读取转换结果 STOSB ;送指定内存单元 MOV DX,20H ;发中断结束命令 MOV AL,20H OUT DX,AL POP DX

IRET

ADINT ENDP CODE ENDS

END START

18.ADC的引线图及工作时序如图8.82所示。试将此ADC与8255相连接,并编写包括初始化程序在内的、变换一次数据并将数据放在DATA中的程序。

图8.82

19. 试利用8255A、ADC0809设计一 IBM PC机 A/D转换接口卡,8255A的地址为02C0H~02C3H,由系统板上的8253定时器0控制每隔5秒采样一遍ADC0809的8路模拟输入,并将采集的数字量显示于CRT屏幕上。

解:

20.简述82380DMA控制器与8237的兼容性。

21.82380DMA控制器中,如果设置为全循环优先级,通道2最低优先级,通道4最低优先级。则开始时各通道的优先顺序是怎样排列的?若通道2完成DMA服务后,各通道的优先顺序又是如何排列的?

22.简述82380中断控制器PIC的功能。

1 0 1 0 1 1 1111111111

AFFFH 16.扩展内存(XMS)与扩充内存(EMS)有何不同?

扩展内存是指CPU能直接寻址的、地址大于1MB以上的内存存储空间。 扩充内存是在微机的CPU寻址范围之外所扩展的物理存储器。

17.简述高速缓冲存储器在微机系统中的作用。

第6章 I/O接口技术

1.CPU与外部设备通讯为什么要使用接口?

2.CPU与输入/输出设备通信时所用到的接口电路通常应具备的功能?

3.I/O端口有哪两种寻址方式?各有何优缺点?

4.8086CPU在执行输入/输出指令时,CPU的哪些控制管脚起作用?什么样的电平有效?

5.计算机输入/输出有哪几种控制方式?各有何优缺点?

6.在输入/输出的电路中为什么常常要用锁存和缓冲器?

7.利用三态门(74LS244)作为输入接口,接口地址规定为04E5H,试画出其与8086总线的连接图。

04E5H = 0000 0100 1110 0101B 部分译码

A2A1A0作为138的CBA输入,即CBA=101,Y5接74LS244的1G、2G引脚 A10A7A6A5=1111作为138的G1使能信号 A4A3=00相或后作为G2A使能信号 A9A8=00相或后作为G2B使能信号

8.在IBM PC机接口开发中用到某一大规模集成电路芯片,其内部占16个I/O端口地址300H~30FH,试设计一个片选信号CS形成电路。

300H = 11 0000 0000B 30FH = 11 0000 1111B

部分译码

A3A2A1A0:接芯片的地址线

A6A5A4:作为138的CBA输入,即CBA=000 A7:作为G2AG2B使能信号

A9A8:相与后作为G1使能信号

9.在某8086微机系统中有一外设,使用存储器映像的I/O寻址方式,要求该外设地址为01000H,试画出其译码器的连接电路,使其译码器输出满足上述地址要求,译码器使用74LS138芯片。

01000H = 0000 0001 0000 0000 0000B

A2A1A0作为138的CBA输入,即CBA=000 A12=1,作为G1使能信号

其他相或后作为G2A、G2B使能信号

10.若第9题中的外设要求用I/O映像的I/O寻址,端口地址为38H,试画出其译码器的连接图。

部分译码

38H = 011 1000B

A2A1A0作为138的CBA输入,即CBA=000 A5A4A3=111,三位地址相与后作为G1使能信号 A7A6=00,可分别作为G2A,G2B使能信号

A5A4A3A7A6A2A1A0&+Y0G1Y1G2AY2G2BY374LS138Y4CY5BY6AY7译码信号M/IO

11.试根据图6.22所示的接口原理,编写一程序段,使从键盘输入一行字符(最大长度为80个字节),该行字符以回车符结尾,输入的字符存放在BUFF开始的内存缓冲区中,并要求每读入一个字符,在终端上显示出来(使用BIOS中断或系统功能调用)。

INPUT1 PROC MOV CX,80 LEA DI,BUFF

LOP1: CMP CX,0 JZ DONE

IN AL,29H AND AL,01H JZ LOP1 IN AL, 28H CMP AL,0DH JZ DONE MOV [DI],AL MOV DL,AL MOV AH,02H

INT 21H DEC CX INC DI JMP LOP1

DONE: RET INPUT1 ENDP

12.试画一个流程图,说明如何用程序控制的I/O把N个字节的数据块输入到存储器中。

13.CPU响应DMA请求和响应中断请求有什么本质性的区别?

14. DMAC(8237A)占几个端口地址?这些地址在读写时的作用是什么?叙述DMAC由内存向端口传送一个数据块的过程。若希望利用8237A把内存中的一个数据块传送到内存的另一个区域,应当如何处理?当考虑8237A工作在8086系统,数据是由内存的某一段向另一段传送且数据块长度大于64K时,应当如何考虑?

15.当DMA8237A获得总线控制权后,它是怎样发出20位地址信号的?写出DMA在PC/XT机中4个通道的分工情况。

16.设8237A口址为00~0FH,编写一个以请求方式进行数据块传送,数据块长为1000H,从内存00000H传送到01000H,传送完不自动预置,DREQ、DACK均为高电平有效的程序。

第7章 中断系统

1.什么是中断?简述一个中断的全过程。

2.8086的可屏蔽中断与非屏蔽中断有何不同?

3.中断向量表的作用是什么?如何设置中断向量表,常用的方法有哪些?

4.类型26H的中断向量在存储器的哪些单元里?

5.已知SP=0100H,SS=0300H,FLAGS=0240H,00020H至00023H单元内容分别是40H,00H,00H,01H,同时还已知INT 8的偏移量00A0H在段基址为0900H的CS段内,试指出在执行INT 8指令并进入该指令相应的中断程序时,SP、SS、IP、CS、FLAGS和堆栈最上面三个字的内容。

解:

(1) 中断响应时,将当前的FLAGS(0240H)、CS(0900H)和IP(00A0H)内容依次压入堆栈,以便返回时恢复。

0300 : 00FA 0300 : 00FB 0300 : 00FC 0300 : 00FD 0300 : 00FE 0300 : 00FF

A0H 00H 00H 09H 40H 02H SS = 0300H,SP = 00FAH

(2) 将FLAGS中的IF标志和TF标志清零

0240H = 0000 0010 0100 0000H(从左到右:第15~0位) IF = 1(第9位),TF = 0(第8位),清零后,FLAGS = 0040H (3) 根据中断类型码,转入中断服务程序入口。 向量地址 = 08H × 4 = 00020H CS = 0100H,IP = 0040H

6.假设中断类型9的中断服务程序的起始地址为INT-POUT,试写出主程序为建立对应中断向量的程序段。

; 设置中断向量-方法1 PUSH DS ; 数据段地址压栈 MOV AX, 0 ; 中断向量表段地址→DS MOV DS, AX MOV BX, 9*4 ; 中断向量地址→BX MOV AX, OFFSET INT-POUT ; 中断向量填入中断向量表 MOV [BX], AX MOV AX, SEG INT-POUT MOV [BX+2], AX POP DS ; 恢复数据段地址 ; 设置中断向量-方法2 PUSH DS MOV AX, SEG INT-POUT MOV DS, AX MOV DX, OFFSET INT-POUT

MOV MOV INT POP AH, 25H AL, 9 21H DS

7.设备D1、D2、D3、D4、D5是按优先级次序排列的,D1的优先权最高,而中断请求的次序如下所示,试给出各设备的中断处理程序的运行次序。假设所有的中断服务程序开始后就有STI指令,并在中断返回之前发出结束命令。

(1) D3和D4同时发出中断请求。

(2) 在D3的中断服务程序完成之前,D2发出中断请求。 (3) 在D4的中断服务程序完成之前,D5发出中断请求。

(4) 以上所有的中断服务程序完成并返回主程序后,D1、D3、D5同时发出中断请求。

8.在上题中,假设所有中断中都没有STI指令,而它们的IRET指令都可以由于FLAGS出栈而使IF=1,则各设备的中断服务程序的运行次序应是怎样的?

9.试定义一个软中断,中断类型码为79H,要求:

(1) 在中断服务程序中,完成ASCII码到BCD码的转换,ASCII码首地址为ASCMM,字节数为NUMB,转换后的BCD码放在BCDMM为首地址的存储区中;

(2) 能正确地转到中断服务程序,即需给出中断向量。试编写出中断服务程序和主程序片断。 解:(完成的是数字的ASCII码到数字的转换) ; 主程序片断

; 设置中断向量-方法1 PUSH DS ;数据段地址压栈 MOV AX, 0 ;中断向量表段地址→DS MOV DS, AX MOV BX, 79H*4 ;中断向量地址→BX MOV AX, OFFSET ATOBCD ;中断向量填入中断向量表 MOV [BX], AX MOV AX, SEG ATOBCD MOV [BX+2], AX POP DS ;恢复数据段地址 ; 设置中断向量-方法2 PUSH DS MOV AX, SEG ATOBCD MOV DS, AX MOV DX, OFFSET ATOBCD MOV AH, 25H MOV AL, 79H INT 21H POP DS ; 中断服务程序

ATOBCD: MOV CX, NUMB

LEA SI, ASCMM LEA DI, BCDMM CLD

本文来源:https://www.bwwdw.com/article/irlh.html

Top