微机原理习题答案1234章

更新时间:2024-05-05 06:29:01 阅读量: 综合文库 文档下载

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

第1章 数制与码制

1. 将下列十进制数转换成二进制数: (1)58;(2)67.625; (3)5721; 解:(1) 58D = 0011 1010B (2) 67.625D = 0100 0011.1010B (3) 5721D = 0001 0110 0101 1001B 2. 将二进制数变换成十六进制数: (1)1001 0101B;

(2)11 0100 1011B; (3)1111 1111 1111 1101B;

(6)0100 0000 0001B

(4)0100 0000 10101B;(5)0111 1111B; 解: (1)1001 0101B = 95H

(2)11 0100 1011B = 34BH (3)1111 1111 1111 1101B = FFFDH (4)0 1000 0001 0101B = 815H (5)0111 1111B = 7FH (6)0100 0000 0001B = 401H

3. 将十六进制数变换成二进制数和十进制数:

(1)78H; (2)0A6H; (3)1000H; (4)0FFFFH 解:(1)78H = 120D = 0111 1000B (2)0A6H = 166D = 1010 0110B

(3)1000H = 4096D = 0001 0000 0000 0000H (4)0FFFFH = 65535D = 1111 1111 1111 1111B 4. 将下列十进制数转换成十六进制数: (1)39; (2)299.34375; (3)54.5625 解:(1)39D = 27H

(2)299.34375D = 12B.58H (3)54.5625D = 36.9H

5. 将下列二进制数转换成十进制数:

(1)10110.101B; (2)10010010.001B; (3)11010.1101B 解:(1)10110.101B = 22.625D

- 0 -

(2)10010010.001B = 146.125D (3)11010.1101B = 26.8125D 6. 计算(按原进制运算):

(1)10001101B+11010B; (2)10111B+11100101B; (3)1011110B-1110B; (4)124AH+78FH; (5)5673H+123H; (6)1000H-F5CH; 解:(1)10100111B

(2) 11111100B (3)1010000B (4)19D9H (5)5796H (6)A4H

7. 已知a=1011B, b=11001B, c=100110B, 按二进制完成下列运算,并用十进制运算检查

计算结果:

(1)a+b; (2)c-a-b; (3)a×b; (4)c÷b 解:a=1011B=11D b=11001B=25D c=100110B =38D

(1)100100B = 36D (2)10B = 2D

(3)1 0001 0011B=275D (4)1B 余1101B= 13D

8. 已知a=00111000B, b=11000111B, 计算下列逻辑运算: (1)a AND b; (2)a OR b; (3)a XOR b; (4)NOT a 解:(1)00000000B (2)11111111B (3)11111111B (4)11000111B

9. 设机器字长为8位,写出下列各数的原码和补码: (1)+1010101B;(2)-1010101B;(3)+1111111B; (4)-1111111B;(5)+1000000B;(6)-1000000B 解:(1)原01010101B 补01010101B (2)原11010101B 补10101011B

- 1 -

(3) 原01111111B 补01111111B (4) 原11111111B 补10000001B (5) 原01000000B 补01000000B (6) 原11000000B 补11000000B

10. 写出下列十进制数的二进制补码表示(设机器字长为8位): (1)15;(2)-1;(3)117;(4)0; (4)-15;(5)127;(6)-128;(7)80 解:(1) (00001111B)补 (2) (11111111B)补 (3) (01110101B)补 (4) (00000000B)补 (5) (11110001B)补 (6) (01111111B)补 (7) (10000000B)补 (8) (01010000B)补

11. 设机器字长为8位,先将下列各数表示成二进制补码,然后按补码进行运算,并用十进

制数运算进行检验:

(1)87-73;(2)87+(-73);(3)87-(-73);

(4)(-87)+73;(5)(-87)-73;(6)(-87)-(-73); 解:(1)1110B=14D (2)00001110B 进位舍弃 (3)10100000B=-96D 溢出 (4)11110010B=-14D (5)01100000B=96D 溢出 (6)11110010B=-14D

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 解:(1)01111100B

- 2 -

(2)00011011B (3)00110011B (4)10100011B (5)11101000B (6)10110111B (7)11010001B (8)11B

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 解:(1)a+b=8EH溢出,a-b=E0H未溢出 (2)8EH未溢出,E0H未溢出

(3)CEH未溢出,20H未溢出 (4)FEH未溢出70H未溢出

14. 求下列组合BCD数的二进制和十六进制表示形式: (1)3251(2)12907(3)2006 解:(1)0011 0010 0101 0001B = 3251H (2)0001 0010 1001 0111B = 12907H (3)0010 0000 0000 0110B = 2006H

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

解:(1) 0011 1000B + 0100 0010B = 0111 1010B 低BCD码位需要加6修正 0111 1010B + 0000 0110B = 1000 0000B = 80BCD

(2) 0101 0110B + 0111 0111B = 1100 1101B 高、低BCD码位都需要加6修正 1100 1101B + 0110 0110B = 0001 0011 0011B=133BCD

(3) 1001 1001B+1000 1000B = 0001 0010 0001B 高、低BCD码位都需要加6修正

0001 0010 0001B +0110 0110B = 0001 1000 0111B=187BCD

(4) 0011 0100B + 0110 1001B = 1001 1101B 低BCD码位需要加6修正

- 3 -

1001 1101B + 0000 0110B = 1010 0011B 修正结果使高BCD码位需要加6修正 1010 0011B +0110 0000B = 0001 0000 0011B = 103BCD

(5) 00111000B-01000010B =(-1)1111 0110B 高 BCD码位需要减6修正 (-1)1111 0110B -0110 0000B =(-1)1001 0110B=-100+96=-4BCD (6)01110111B-01010110B = 0010 0001B = 21BCD

(7) 00011001B-01110110B =(-1)1001 1111B 高、低BCD码位都需要减6修正 (-1)1001 1111B -01100110B =(-1)0011 1001B = -100+39 = -61BCD (8)10001001B-00100011B = 0110 0110B = 66BCD

16. 将下列字符串表示成相应的ASCII码(用十六进制数表示): (1)Example 1;(2)XiDian University;(3)-108.652; (4)How are you?;(5)Computer(6)Internet Web 解:(1)45H,78H,61H,6DH,70H,6CH,65H,20H,31H

(2) 58H,69H,44H,69H,61H,6EH,20H,55H,6EH,69H,76H,65H,72H,73H,69H,74H,79H (3)2DH,31H,30H,38H,2EH,36H,35H,32H

(4)48H,6FH,77H,20H,61H72H,65H,20H79H,6FH,75H (5)43H,6FH,6DH,70H,75H,74H,65H,72H

(6)49H,6EH,74H,65H72H,6EH,65H,74H,20H,57H,65H,62H 17. 将下列字符串表示成相应的ASCII码(用十六进制数表示): (1)Hello(2)123456;(注:表示回车)(3)ASCII; (4)The number is 2315

解:(1)48H,65H,6CH,6CH,6FH (2)31H,32H,33H,0DH,34H,35H,36H

(3)41H,53H,43H,49H,49H (4)54H,68H,65H,20H,6EH,75H,6DH,62H,65H,72H

- 4 -

(9)RCR DL,1 DL带进位循环右移1 0000 0000 1101 1101B = 00DDH

15. 选择题(各小题只有一个正确答案)

(1)执行下列三条指令后:

MOV SP,1000H PUSH AX CALL BX

a. (SP)=1000H; c. (SP)=1004H;

b. (SP)=0FFEH; 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. 寻址方式不同; c. 目的地址不同;

b. 是否保存IP的内容; d. 对标志位的影响不同。

解:(1)D (2)C (3)B

PUSHU AX则AX入栈,SP=0FFEH;CALL BX则IP入栈,SP=0FFCH 异或,若相同,则AL=0,ZF=1。

16. 寄存器DX:AX组成32位数,DX为高位,编写程序段实现:

(1)DX:AX右移3位,并将移出的低3位保存在CL中; (2)DX:AX左移3位,并将移出的高3位保存在CL中; 解:(1)移出的3位应该按时序移入CL中。

XOR CL,CL MOV BL,3

L1: SHR DX,1

RCR AX,1 RCL CL,1 DEC BL JNZ L1

(2)移出的3位应该按时序移入CL中。

XOR CL,CL

- 15 -

MOV BL,3

L1: SHL AX,1

RCR DX,1 RCR CL,1 DEC BL JNZ L1

17. 编写程序段实现将BL中的每一位重复4次,构成32位的双字DX:AX,例如当BL

=01011101B时,则得到的(DX)=0F0FH,(AX)=0FF0FH。

解:算术右移时,移入的值就是最高位本身,这样可以使位内容重复,利用这一点可以实现题目的要求。

XOR XOR MOV

DX,DX AX,AX CX,4 BL,1 AX,1 AX,1 AX,1 AX,1 L1 CX,4 BL,1

DX,1 DX,1 DX,1 DX,1 L2

L1: SHR

RCR SAR SAR SAR LOOP MOV

L2: SHR

RCR SAR SAR SAR LOOP

18. 字变量VAR1中保存有小于38250的16位无符号数,编写程序段实现VAR1÷150,并

进行四舍五入操作,将商保存在字节变量VAR2中。

解:根据题意,38250÷150=255,因此商不会超过255,可以用一个字节表示。

a÷b的四舍五入操作可以通过判断除后余数实现:余数大于等于除数的一半,则商加1;

- 16 -

否则不用加1。但这种方法用汇编语言编程实现时比较复杂,这里介绍另外一种方法:设a÷b的四舍五入后的结果为c,用『』表示取整数操作,则

b???a??a?2? c???0.5???b??b???这种方法是在除法操作之前,在被除数上加上除数的一半,这样除法操作后得到的值就是考虑了四舍五入的商。 VAR1

DW 12345

DB ?

DB 150

VAR2

DATAA

MOV AX,VAR1 XOR BX,BX MOV BL,DATAA SHR BX,1 ADD AX,BX DIV DATAA

MOV VAR2,AL

19. 有一组无符号的16位数据保存在BUFFER中,前两个字节存放数据的个数,编程实现

按下式进行滤波处理:

1?x(k)?x(k?1)?x(k?2)?3y(k)?x(k)y(k)?解:滤波结果保存在FILT中。

BUFFER DW 0CH

k?2k?2

DW 33H, 18H, 1BH, 06H, 33H, 08H DW 3H, 6H, 0FH, 51H, 05H, 0CH

LEA SI,BUFFER LEA DI,FILT

- 17 -

FILT DW 100H DUP(?)

MOV CX,[SI] MOV [DI],CX ADD SI,2 ADD DI,2 XOR DX,DX MOV AX,[SI] MOV [DI],AX MOV BX,2[SI] MOV 2[DI],BX ADD SI,4 ADD DI,4 DEC CX DEC CX ADD AX,BX ADC DX,0 MOV BX,3 L1:

ADD AX,[SI] ADC DX,0 PUSH DX PUSH AX DIV BX MOV [DI],AX POP AX POP DX SUB AX, [SI-4] SUBB DX,0 ADD DI,2 ADD SI,2 LOOP L1

18 -

20. 在由字符串构成的缓冲区BUFFER中,前2个字节存放字符个数,后续每个字节存放

一个字符的ASCII码。编写程序实现将字符串‘2004’替换成‘2006’。 解:在数据段中定义:

BUFFER DW 74 DB ‘This year is 2004. In 2004, we have a plan for reducing annual expensive 10%’

DEST DB ‘2004’

在代码段中编写程序段:

CLD LEA SI, BUFFER MOV CX,[SI] ADD SI,2 LEA

DI,DEST

L1: PUSH SI PUSH DI PUSH

CX

MOV CX,4 REPZ SCASB JNZ

L2

MOV BYTE PTR [SI-1],’6’ L2: POP CX POP DI POP SI INC SI INC

DI

LOOP L1

21. 定义有下列宏指令:

WAGS MACRO S1,S2,S3

SUB AX,AX

19 -

MOV CX,8 XOR BL,BL

COU1:

SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP

在此基础上,可以检测出字节型缓冲区BUF中0和1个数相等的元素个数,即一个字

节中有4个1。设BUF中有N个字节型数据,结果保持在BH中。

MOV CX,N LEA SI, BUF XOR BH,BH L1: MOV AL,[SI]

CALL COUNTBYTE CMP BL,4 JNZ L2 INC BH L2: INC SI

LOOP L1

19. 在缓冲区BUFFER中,第1个字节存放数组的长度(<256),从第2个字节开始存放字

符的ASCII码,编写子程序完成在最高位给字符加上偶校验。 解:STACK SEGMENT STACK 'STACK' DW 100H DUP(?) TOP LABEL BYTE

STACK ENDS

- 30 -

DATA SEGMENT BUFFER DB 3 DB 'ABC'

DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK

START:

MOV AX,STACK MOV SS,AX LEA SP,TOP MOV AX,DATA MOV DS,AX MOV ES,AX LEA DI,BUFFER XOR CX,CX MOV CL,[DI] INC DI

CALL SETEVEN MOV AH,4CH MOV AL,0 INT 21H SETEVEN PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DI SETEVEN1:

MOV AL,[DI] CALL COUNTBYTE

- 31 -

;首字节为字符串长度 ;字符串

;返回DOS

;加偶校验子程序

AND BL,01H JZ SETEVEN2 OR AL,80H MOV [DI],AL SETEVEN2: INC DI

LOOP SETEVEN1 POP DI POP CX POP BX POP AX RET SETEVEN ENDP COUNTBYTE

PROC NEAR

PUSH AX PUSH CX MOV CX,8 XOR BL,BL

COU1:

SHR AL,1 ADC BL,0 LOOP COU1 POP CX POP AX RET COUNTBYTE ENDP

CODE ENDS END START

20. 编写程序完成求多位数(N个字)的绝对值。

- 32 -

21. 已知斐波那契数列的定义为:F1数列前n项的子程序。

?1,F2?1,Fi?Fi?1?Fi?2(i?3),编写求该

解:设奖斐波那契数列存放在字变量RESULT中。在数据段中定义 RESULT DW 100H DUP(?)

在代码段中编写子程序 FIBONACCI

PROC NEAR

XOR DI,DI

MOV RESULT[DI],1

;前两个数为1

MOV RESULT[DI+2],1

ADD DI,4 MOV CX,N

L1:

MOV AX, RESULT[DI-4] ADD AX, RESULT[DI-2] MOV RESULT[DI],AX ADD DI,2 LOOP L1 RET FIBONACCI ENDP

22. 编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM10。 解:在数据段中定义变量:

TABLE DW INFORM1, INFORM2, INFORM3, INFORM4, INFORM5 DW INFORM6, INFORM7, INFORM8, INFORM9, INFORM10 在代码段中编写程序段:

MOV XOR MOV MOV

CX,10 SI,SI

DX,TABLE[SI] AH,9

L1:

- 33 -

INT ADD CALL LOOP

21H SI,2 WAIT L1

这里,WAIT为延时子程序,用于在显示信息之间的停顿。

23. 编写程序实现将包含20个数据的数组ARRAY分成两个数组:正数数组ARRAYP和负数数组ARRAYN,并分别将这两个数组中数据的个数显示出来。

解:先编写一个子程序DISPALD,完成以3位十进制数形式显示出AL的内容。

DISPALD PROC NEAR

PUSH AX PUSH CX PUSH DX XOR AH,AH MOV CL,100 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2 INT 21H POP AX MOV AL,AH XOR AH,AH MOV CL,10 DIV CL PUSH AX MOV DL,30H ADD DL,AL MOV AH,2

- 34 -

INT 21H POP AX MOV DL,30H ADD DL,AH MOV AH,2 INT 21H POP DX POP CX POP AX RET

DISPALD ENDP

在此基础上,根据题目要求,需要用到3个指针:SI指向源数组ARRAY,DI指向正数数组ARRAYP,BX指向负数数组ARRAYN。

MOV XOR LEA LEA LEA MOV AND JS MOV INC INC JMP MOV INC INC INC

CX,20 DX,DX SI,ARRAY DI,ARRAYP BX,ARRAYN AL,[SI] AL,AL L2 [DI],AL DI DL L3 [BX],AL BX DH SI

- 35 -

L1:

L2:

L3:

LOOP MOV CALL MOV CALL

L1 AL,DL DISPALD AL,DH DISPALD

24. 编写程序实现求缓冲区BUFFER的100个字中的最小偶数(存入AX)。 解:设BUFFER中存放的是有符号数。 L1: L2:

MOV CX,100 LEA SI,BUFFER MOV AX, 7FFFH AND WORD PTR [SI],1 JNZ L2 CMP [SI],AX JGE L2 MOV AX,[SI] ADD SI,2 LOOP L1

225. 编写程序实现求级数1解:BL用于存放项数。

?22???n2??的前n项和刚大于2000的项数n。

STACK SEGMENT STACK 'STACK' DW 100H DUP(?) TOP

LABEL WORD

STACK ENDS DATA SEGMENT DB 100H DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA, ES:DATA, SS:STACK START:

- 36 -

MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV BL,1 MOV CX,0 COUNT:

MOV AL, BL MUL BL ADD CX,AX CMP CX,2000 JA EXIT INC BL JMP COUNT

EXIT:

26. 定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES或DS的功能。 解:

27. 定义一条宏指令,实现从键盘中输入一个字符串(利用INT 21H的09号功能)。 28. 定义一条宏指令,实现在屏幕上输出回车、换行。 29. 利用其它指令完成与下列指令一样的功能:

(1)REP MOVSB; (3)REP STOSB;

解:设DF=0 (1)

(2)REP LODSB; (4)REP SCASB。

L1: MOV AL,[SI]

MOV ES:[DI],AL INC INC

SI DI

- 37 -

LOOP L1

(2)

L1: MOV AL,[SI]

INC

SI

LOOP L1

(3)

L1: MOV ES:[DI],AL

INC

DI

LOOP L1

(4)

L1: MOV AL,[SI]

CMP AL,ES:[DI] INC INC

SI DI

LOOP L1

30. 设在数据段中定义了:

STR1 DB ‘ASSEMBLE LANGUAGE’ STR2 DB 20 DUP(?) 利用字符串指令编写程序段实现:

(1)从左到右将STR1中的字符串传送到STR2; (2)从右到左将STR1中的字符串传送到STR2; (3)将STR1中的第6个和第7个字节装入DX;

(4)扫描STR1字符串中有无空格,如有则将第一个空格符的地址传送到SI。 解: STR1中有17个字符(含一个空格),设DS和ES均指向STR1和STR2所在的段。 (1)

CLD MOV LEA LEA REP MOV LEA LEA

CX,17 SI,STR1 DI,STR2 MOVSB CX,17 SI,STR1 DI,STR2

- 38 -

(2)

ADD DEC MOV MOV DEC INC LOOP LEA MOV MOV LEA MOV CMP JZ INC LOOP

SI,CX SI AL,[SI] [DI],AL SI DI L1 SI,STR1 DX,[SI+6] CX,17 SI,STR1 AL,20H [SI], AL L2 SI L1

L1:

(3)

(4)

L1:

L2:

31. 设在数据段中定义了:

STRING DB ‘Today is Sunday & July 16, 2000’

编写程序实现将STRING中的’&’用’/’代替。 解:STRING中保存了30个字符。

MOV LEA MOV CMP JNZ MOV INC LOOP

CX,30 SI,STRING AL,’&’ [SI],AL L2

BYTE PTR [SI],’/’ SI L1

- 39 -

L1:

L2:

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

Top