《微机原理与接口技术》参考答案

更新时间:2024-05-07 04:55:01 阅读量: 综合文库 文档下载

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

《微机原理与接口技术》习题参考答案

习题2

1. 为何说8086CPU是16位CPU?

答:16位指的是8086CPU的字长,而字长一般来说和运算器、寄存器、总线宽度一致。因为8086CPU的内部寄存器、内部运算部件以及内部操作都是按16位设计的,这决定了它的字长为16位。

2. 8086CPU由哪两个单元组成?其中,指令队列在哪个单元中,有何作用?

答:总线接口单元(Bus Interface Unit,BIU)和执行单元(Execution Unit,EU)。指令队列在BIU中。它的作用是当EU在执行指令时,空闲的BIU可以从内存读取后续指令到指令队列,这样就可以将取指令工作和执行指令工作重叠进行,从而提高CPU的工作效率,加快指令的执行速度。

3. 8086CPU中8位寄存器和16位寄存器是什么关系?

答:8086的通用寄存器包括数据寄存器、指针寄存器和变址寄存器。其中数据寄存器包含AX、BX、CX、DX四个16位寄存器,但他们每个都可以分开作为两个单独的8位寄存器使用。8086的指针寄存器和变址寄存器不可分割为8位寄存器。 4. 8086CPU中的IP寄存器有何用途?

答:IP寄存器是指令指针寄存器,用来存放下一条要执行的指令在代码段中的偏移地址。在程序运行过程中,IP寄存器始终指向下一条指令的首地址,与CS寄存器联合确定下一条指令的物理地址。8086就是通过IP寄存器来控制指令序列的执行流程。

5. 在标志寄存器中,用于反映运算结果属性的标志位有哪些?它们每一位所表示的含义是

什么?

答:有CF、PF、AF、ZF、SF、OF。它们的含义如下:

CF:进位标志。它记录运算时从最高有效位产生的进位值或结果值。最高有效位有进位

或有借位时CF=1,否则CF=0。

PF:奇偶标志。它记录运算结果的奇偶检验条件。当结果操作数中“1”的个数为偶数

时PF=1,否则PF=0。

AF:辅助进位标志。在字节运算时,由低半字节(字节的低4位)向高半字节有进位或

借位时,AF=1,否则AF=0。

ZF:零标志。运算结果为零时ZF=1,否则ZF=0。

SF:符号标志。它记录运算结果的最高位,即由符号数的符号。

OF:溢出标志。在运算过程中,如果运算结果已经超出了机器能表示的数值范围(指有

符号数)称为溢出,此时OF=1,否则OF=0。

6. 分别完成下面的8位运算,并说明各主要标志位的状态,以及结果是否产生溢出(提

示:需要分为有符号数和无符号数两种情况)。

·1·

(1)90H+3CH (2)3CH-90H (3)7DH-9CH 答:(1)有符号:CCH 主要标志CF=0 PF=1 AF=0 ZF=0 SF=1 OF=0 无溢出

无符号:CCH 主要标志CF=0 PF=1 AF=0 ZF=0 SF=1 OF=0 无溢出 (2)有符号:ACH 主要标志CF=1 PF=1 AF=0 ZF=0 SF=1 OF=1 溢出

无符号:ACH 主要标志CF=1 PF=1 AF=0 ZF=0 SF=1 OF=0 溢出 (3)有符号:E1H 主要标志CF=1 PF=1 AF=0 ZF=0 SF=1 OF=1 溢出

无符号:E1H 主要标志CF=1 PF=1 AF=0 ZF=0 SF=1 OF=0 溢出

7. 假设下列各组数值均分配在10000H开始的连续存储单元中,分别画出各组数值在内存

中的存储形式。 字节:2、‘2’、‘B’、‘b’和‘0’; 字:12H、1004H、-1和0; 双字:420H、12345678H和0。 答:(1) 2 ‘2’ ‘B’ ‘b’ ‘0’ 1002H 32H 42H 62H 30H 000H (2) 12H 1004H -1 0 10000H 12H 04H FFH 00H 10001H 00H 10H FFH 00H (3) 420H 12345678H 0 10001H 20H 78H 00H 10002H 04H 56H 00H 10003H 00H 34H 00H 10004H 00H 12H 00H 8. 什么是物理空间?8086CPU的物理地址是多少位?其决定的物理空间有多大?

答:物理空间是指由编址单元(如字节)大小和地址总线宽度决定的可寻址的存储器地址空间。8086CPU具有20条地址总线,所以它的物理地址是20bit。8086的存储是按照字节存储的,所以其物理空间为220B=1MB。

9. 什么是逻辑空间?8086的逻辑空间有何特点?其逻辑地址如何构成?

答:采用分段存储管理方式,将物理空间分割,通过段映射构建的由多个独立的逻辑段构成的存储空间即为逻辑空间。8086使用16位地址在段内寻址,称为段的偏移地址,因此其特点是段的最大长度2=64KB。在8086中,将16位的段地址和16位的偏移地址合称为逻辑地址,其中段地址舍弃了最低四位的0,故逻辑地址等于段地址乘以10H加偏移地址。

10. 简述面向逻辑空间编程比面向物理空间编程的优势。

答:可以解除程序设计对实际物理空间的依赖。具体表现在:

程序设计时不需要了解存储器的使用情况,操作系统或监控程序会将程序分配在空闲

空间,不会和系统程序或其他程序冲突; ·2·

16第二,程序设计时采用的是逻辑空间的地址,存储管理部件将自动、透明地进行逻辑

空间地址到物理空间地址的转换,即逻辑空间到物理空间的映射,所以,不同的空间分配对程序没有影响;

第三,逻辑空间是相对“观察者”而言的,即不同的人面对的逻辑空间是独立无关

的,所以每个编程者都是在自己的逻辑空间上编程。

11. 8086CPU是如何实现逻辑空间到物理空间的映射的?

答:逻辑空间的段地址指明要访问的存储单元所处的段,偏移地址指明存储单元的段内地址。段地址表示段在物理空间上的起始位置,偏移地址表示要访问的存储单元相对于起始位置的偏移量。

12. 简述段寄存器的作用。

答:为了保证地址转换的效率,访问存储器时,总是由段寄存器提供段址。8086在BIU中设有4个段寄存器(CS、DS、SS、ES),CPU可以在某一时刻通过这4个段寄存器来访问4个不同的段。在程序设计层面,可以通过指定段和段寄存器的关系来标识段,这样在实际编程时,绝大多数情况下逻辑地址只需要指定偏移地址。 13. 已知当前(CS)=7F00H,(IP)=017CH,问下条指令的物理地址是什么?

答:(CS)*10H+(IP)=7F00H*10H+017CH=7F000H+017CH=7F17CH 14. 已知当前(DS)=5C00H,(ES)=5D10H,而数据的物理地址是63654H,若分别使用

DS和ES段寄存器访问该数据,问偏移地址分别是多少?

答:若使用DS,则(IP)=63654H-(DS)*10H=63654H-5C000H=7654H。 若使用ES,则(IP)=63654H-(ES)*10H=63654H-5D100H=6554H。

15. 什么是I/O端口?8086CPU的端口空间是多大?需要使用地址总线的多少位访问端口空

间?

答:I/O端口即输入输出接口,是外部设备和主机交换信息的接口,在它们之间的通信中起到了转换和缓冲数据的作用。8086的 I/O端口空间大小为2=64KB。需要16位,8086使用地址总线的低16位访问I/O端口。

16. 简述Intel的32位处理器如何对16位处理器的寄存器进行扩展,有何好处。

答:(1)将16位通用寄存器扩展16位形成32位通用寄存器。同时还保留了原来的16位寄存器和8位寄存器。

(2)将指令寄存器IP扩展16位形成32为的EIP寄存器。

(3)段寄存器仍然是16位的,但增加了FS和GS两个段寄存器。

(4)将寄存器Flags扩展16为形成32位的EFLAGS标志寄存器,增加了新的标志。

32位微处理器完整保留了16位微处理器的寄存器结构,可保证16位架构的程序可以不经修改的运行在32位架构中,即向前兼容,是Intel商业成功的重要保证。 17. 简述32位处理器的工作模式。

答:(1)实模式。实模式下的工作原理与8086相同,就相当于一个告诉的8086处理器。

(2)保护模式。该模式有以下特点:支持多任务;支持存储器的分段管理和分页管理,易于实现虚拟操作系统;具有保护功能,包括存储器保护、任务特权级保护和任务之

·3·

16间的保护。

(3)虚拟8086模式。虚拟8086模式是为了在保护模式下执行8086程序而设计的。在虚拟8086模式下可执行16位的软件,同时虚拟8086模式又可以以任务的形式与真正的32位任务进行切换,共享资源。 18. 简述保护模式下存储管理的特点。

答:在保护模式下,微处理器支持分段存储管理和分页存储管理。分段存储管理完成

由多个逻辑段构建的逻辑空间映射到线性空间的工作;程序设计面向逻辑空间进行;如果不使用分页存储管理,则线性空间就是物理空间;分页存储管理将线性空间按照一定的大小(4KB)划分页(逻辑页),然后以页为单位在物理空间上进行分配(物理页)和回收,并实现逻辑页到物理页的映射;分页存储管理对使用者是透明的。

习题3

1. 指令由哪两部分构成?分别起什么作用?

答:由操作码和操作数组成。操作码表示指令所要完成操作的功能和性质,操作数提供该操作的对象。

2. 存储器寻址方式提供的是什么地址?它最终如何映射到实际的物理地址?

答:由段址和偏移地址组成的逻辑地址。逻辑空间的段地址指明要访问的存储单元所处的段,偏移地址指明存储单元的段内地址。段地址表示段在物理空间上的起始位置,偏移地址表示要访问的存储单元相对于起始位置的偏移量。

3. 简述立即寻址和直接寻址、寄存器寻址和寄存器间接寻址的区别。

答:立即寻址的指令所需的操作数直接存放在指令中,指令的操作数字段就是真正的操作数。直接寻址是在指令中给出操作数所在内存单元的段内偏移量。寄存器寻址的操作数存放在寄存器中,指令的操作数字段是使用的寄存器。寄存器间接寻址方式中,寄存器内存放的是操作数的地址,而不是操作数本身,即操作数是通过寄存器间接得到的。 4. 指出下列各种操作数的寻址方式。

MOV AX,420H MOV [BX],SI MOV AX,[90] MOV [DI+90],AH MOV AL,[BP+SI+20]

答:答案一(默认求源操作数寻址方式)

1) MOV AX, 420H 立即寻址 2) MOV [BX], SI 寄存器寻址 3) MOV AX, [90] 直接寻址 4) MOV [DI+90], AH 寄存器寻址

5) MOV AL, [BP+SI+20] 相对基址变址寻址 答案二

1) MOV AX, 420H 源:立即寻址 目:寄存器寻址 ·4·

2) 3) 4) 5) MOV [BX], SI MOV AX, [90] MOV [DI+90], AH MOV AL, [BP+SI+20] 源:寄存器寻址 目:基址寻址 源:直接寻址 目:寄存器寻址 源:寄存器寻址 目:变址寻址 源:(相对)基址变址寻址 目:寄存器寻址

5. 指出下列寻址方式中源操作数所使用的段寄存器。

MOV AX,[SI+20H] MOV AL,[1000H] MOV AX,ES:[BX][SI] MOV AX,[BP+1234H] 答:(1)DS(2)DS (3)ES (4)SS 6. 已知寄存器(BX)=2010H、(DI)=0FFF0H和(BP)=420H,试分别计算出下列寻址方式

中源操作数的有效地址。 MOV AX,[2345H] MOV AX,[BX]

MOV AX,ES:[DI+200] MOV AX,DS:[BP+DI] MOV AX,[BX+DI+114H] 答:

1) MOV AX, [2345H] 2345H 2) MOV AX, [BX] 2010H 3) MOV AX, ES:[DI+200] 0B8H 4) MOV AX, DS:[BP+DI] 410H 5) MOV AX, [BX+DI+114H] 2114H 7. 使用类似MOV指令的双操作数指令需要注意什么? 答:(1)MOV指令不需要经过ALU处理,所以对标志位没有影响;

(2)MOV指令是双操作数指令,在使用时有一些限制:立即数不能作为目的操作数;CS不能作为目的操作数;段寄存器不能到段寄存器;立即数不能到段寄存器;内存不能到内存;

8. 8086系统的堆栈是如何组织的?如何判断堆栈满或空?

答:8086的堆栈采用存储器方式实现,8086将堆栈组织为一个逻辑段,称为堆栈段。堆栈段的段址由寄存器SS指定,堆栈指针由SP寄存器担当。若SP当前值等于SS段址的内的最小值,即SP为0时,堆栈满;若SP当前值等于堆栈指定的SP初始值时,堆栈空。 9. 已知(SS)=0FF00H、(SP)=00B0H,先执行两条将8086H和0F20H入栈的PUSH指令,

再执行一条POP指令。请画出堆栈内容变化过程示意图(请标出存储单元的物理地址)。 答: 执行完两条PUSH后: | |0FF00H←SS

·5·

| | | |

?? 20H 0FH 86H 80H

|0FFACH←SP |0FFADH |0FFAEH |0FFAFH

再执行一条POP后:

| |0FF00H←SS ?? | 86H |0FFAEH←SP | 80H |0FFAFH

10. 用一条指令实现将BX与SI之和传送给CX的功能。

答:LEA CX, [BX+SI]

11. 写出下列指令中每条指令的执行结果,并指出标志位CF、ZF、OF、SF的变化情况。

MOV BX, 40ABH ADD BL, 09CH MOV AL, 0E5H CBW ADD BH, AL SBB BX, AX ADC AX, 20H SUB BH, -9 答:MOV BX, 40ABH ;将立即数40ABH传给寄存器BX,对标志位无影响 ADD BL, 09CH ;将9CH与ABH相加,结果47H存入BL,CF=1,ZF=0, ;OF=1,SF=0 MOV AL, 0E5H ;将立即数E5H传给寄存器AL,对标志位无影响 CBW ;对AL进行符号扩展,即AX为FFE5H,对标志位无影响 ADD BH, AL ;将AL中的数即E5H与BH中的数40H相加,结果25H存BH, ;CF=1,ZF=0,OF=1,SF=0 SBB BX, AX ;将BX中的数2547H减去AX中的数FFE5H,再减去标志位 ;CF=1,即将结果2561H存入BX中,CF=1,ZF=0,OF=1,SF=0 ADC AX, 20H ;将AX中的数FFE5H加20H,再加CF=1,即得0006H存 ;入AX,CF=1,ZF=0,OF=1,SF=0 SUB BH, -9 ;将BH中的数25H加上F7H(补码),即得1BH存入BH,CF=1,

;ZF=0,;OF=1,SF=0

12. 简述乘法指令和除法指令寻址方式的特点。

答:都是隐含寻址指令。都分8位和16位两种情况,其中8位乘法的被乘数在AL ·6·

中,指令给出8位乘数,得到的16位结果存放在AX中;16位乘法的被乘数在AX中,指令给出16位被乘数,32位结果在DX:AX中。8位除法的16位被除数在AX中,指令给出8位除数,8位商在AL中,8位余数在AH种;16位除法的32位操作数在DX:AX中,指令给出16位操作数,16位商在AX中,16位余数在DX中。乘法指令和除法指令都不允许立即数。

13. 完成一个计算DL(无符号数)三次方的指令序列。

答:MOV AL,DL IMUL DL MUL DL 14. 按下列要求编写指令序列。

清除DH中的最低三位而不改变其他位,结果存入BH中;

把DI中的最高5位置1而不改变其他位; 把AX中的0~3位置1,7~9位取反,13~15位置0; 检查BX中的第2、5和9位中是否有一位为1; 检查CX中的第1、6和11位中是否同时为1; 检查AX中的第0、2、9和13位中是否有一位为0; 检查DX中的第1、4、11和14位中是否同时为0; 答:(1)MOV BH,F8H

AND

BH,DH

(2)OR DI,FFF8H (3)OR AX,000FH XOR AX,0380H

AND

AX,1FFFH

(4)MOV DX,BX

TEST DX,0004H;若ZF=0,则第2位为1 TEST DX,0020H;若ZF=0,则第5位为1

TEST

DX,0200H;若ZF=0,则第9位为1

(5)XOR CX,0824H

JE

YES

(6)TEST DX,0001H;若ZF=1,则第0位为0

·

TEST TEST TEST

DX,0002H;若ZF=1,则第2位为0 DX,0200H;若ZF=1,则第9位为0 DX,2000H;若ZF=1,则第13位为0

(7)XOR DX,4812H

JE

YES

15. NOT指令和NEG指令有何不同?编写指令序列将(DX:AX)中的双字算数求反。

答:NOT指令是对操作数的按位求反,称为逻辑求反。而NEG指令是算数求反。 NOT NOT ADD ADC

AX DX AX,1 DX,0

16. 使用移位指令将40和-49分别乘2和除2,请注意选择合适的移位指令。

答:MOV

SHL MOV SAR MOV SHL MOV SAR

AX,0028H;将40存入AX AX,1;(AX)*2 AX,0028H;将40存入AX AX,1;(AX)/2

AX,FFCFH;将-49存入AX AX,1;(AX)*2

AX,FFCFH;将-49存入AX AX,1;(AX)/2

17. 分析下面指令序列完成的功能。

MOV CL, 4 SHL

DX,

CL

MOV BL, 4H SHL SHR

AX, BL, CL

CL

·8·

OR DL,BL

CL,

4;将4存入CL

答:MOV SHL

DX, CL;(DX)*16

MOV BL, 4H;将4H存入BL SHL SHR OR

AX,

CL;(AX)*16

BL, CL;(BL)右移4位,为0 DL,BL;BL为0,取得DL的高四位

18. 方向标志DF的作用是什么?用于设置或消除该标志位的指令是什么?

答:作用是控制串的处理方向。指令STD设置DF=1,CLD清除DF。

19. 已知数据段中保存有100个字的数组,起始地址为0B00H。编写指令序列实现将-1插入

到第一个字。 答:

20. 什么是段间转移?什么是段内转移?它们的实现机制有何不同?

答:根据转移指令和转移指令要转移到的目标位置之间的关系,把转移分为段内转移和段间转移。段内转移中,转移的目标位置在当前代码段内,CS的内容不变,只改变IP的内容;段间转移中,转移的目标地址不在本段,此时CS和IP的内容都需要修改。 21. 条件转移指令中,所谓的“条件”是什么,如何做到?如何使用?请举例说明。

答:所谓的条件就是某个标志位或某几个标志位的状态。单一条件的5个标志位ZF、CF、OF、SF和PF,以及它们的否定。多个标志位的联合还可以构成复合条件。例如:

CMP JZ ?? Equal:

22. 假设AX和BX中的内容是有符号数,CX和DX中的内容是无符号数,试实现:

如果(DX)>(CX),则转到EXCEED; 如果(BX)>(AX),则转到EXCEED;

AX,1 ;执行(AX)-1不保存结果 Equal

;如果结果为零(ZF=1)则转移到Equal

·9·

如果(CX)=0,则转到ZERO;

如果(BX)-(AX)将产生溢出,则转到OVERFLOW; 如果(BX)?(AX),则转到NOTBIG; 如果(DX)?(CX),则转到NOTBIG; 答:(1)CMPDX,CX

JA

EXCEED

(2)CMPBX,AX

JG

EXCEED

(3)CMPCX,0

JZ

ZERO

(4)CMPBX,AX

JO

OVERFLOW

(5)CMPBX,AX

JLE

NOTBIG

(6)CMPDX,CX

JBE

NOTBIG

23. 已知数据段中保存有100个字的数组,起始地址为0B00H。编写指令序列实现将数组中

的每个字加1。 答:LEA

MOV

SI,0B00H CX,100 AX,[SI] AX [SI],AX SI,2 L1

L1:MOV

INC MOV ADD LOOP

24. 简述段内调用和段间调用的主要区别。

· ·10

JE EXIT

CMP BYTE PTR [BX],20H JNE NEXT DELETE: PUSH BX

MOV DL,[BX+1] MOV [BX],DL INC BX

CMP [BX+1],0 JZ NEXT JMP DELETE NEXT: POP BX INC BX JMP AGAIN EXIT: MOV SI,0

CMP BYTE PTR [SI],20H JE CYCLE LEA BX,STR COMPARE:

CMP BYTE PTR [BX],20H JE PRINT INC BX

JMP COMPARE PRINT:

MOV [BX],'$' LEA DX,STR MOV AH,09H INT 21H

MOV AH,07H INT 21H

MOV AX,4C00H INT 21H CODE ENDS END START

16.假设从变量Buff开始存放了200个字,编写一个程序统计出其正数、0和负数的个数,并把它们分别存入N1、N2和N3中。 答:DATA SEGMENT SAVE DB 3 DUP(?) · ·16

NUM DW 100 DUP(?) DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,100 XOR BX,BX XOR DX,DX LEA SI,NUM SUB SI,2 NEXT1:ADD SI,2 CMP [SI],0 JNZ NZ

INC BL ;存放零的个数 JMP OK

NZ: TEST [SI],8000H JNZ N

INC DH ;存放正数的个数 JMP OK

N: INC DL ;存放负数的个数 OK: LOOP NEXT1

MOV SAVE,DH ;将结果传送到内存保存 MOV SAVE+1,DL MOV SAVE+2,BL MOV AH,4CH INT 21H CODE ENDS

END START

17.用双重循环将下三角乘法表存入从Result开始的45字节中。

18.简述在子程序结构中堆栈的作用。

答:子程序在调用和返回时,使用堆栈来保存断点和恢复断点。对于段内调用,CALL指令调用子程序时首先保存断点使IP入栈,然后转子程序。RET指令返回时要使IP出栈恢复断点。对于段间调用,保存断点时要使CS和IP分别入栈,恢复断点时使IP和CS出栈。 19.如何区分RET指令是段内返回还是段间返回?

答:汇编程序在处理子程序时,根据PROC后的子程序类型的说明来确定子程序的类型属性,也确定了是将RET助记符翻译为段内返回还是段间返回。

20.在子程序中如果要使其所用寄存器对调用者是透明的,请举例说明达到其目的的方法。 答:在子程序中如果要使其所用的寄存器对调用者是透明的,就是要注意寄存器的保存和恢

·17·

复,以便当返回调用程序后仍然保持正确的状态继续执行。例如,在子程序开始时,把它要用到的所有寄存器都入栈保存,在返回前再出栈恢复。

21.子程序参数传递主要有哪些方法?它们各有什么优缺点?

答:主要有三种方法:1)通过寄存器传递;2)通过存储器传递;3)通过堆栈传递。通过寄存器传递参数速度快,但参数个数受寄存器数量的限制,适用于参数很少的情况。通过存储器传递参数,可以相互传送较多的参数。通过寄存器和存储器传递参数都具有全局性质,而通过堆栈传递的参数确是局部性的,它们的生命周期随着子程序结束后堆栈的复原而结束,这样在子程序中对参数进行修改对调用者没有任何影响。 22.分别编写子程序实现下列功能(所有变量都是字类型)。

(1)ABS(x)=|x|

(2)F(x)=3x2 + 5x - 8 (3)strlen(String),(求字符串长度,字符串以0结束)

23.给定一个正数n≥1存放在NUM字变量,试编写递归子程序计算FIB(n),结果保存到RESULT变量中。

Fibonacci数定义如下:

答:STACK SEGMENT STACK 'STACK' DW 32 DUP(0) STACK ENDS DATA SEGMENT A DB 8 DUP(0) OBF DB 3,0,3 DUP(0) DATA ENDS

CODE SEGMENT BEGIN PROC FAR

ASSUME SS:STACK,CS:CODE,DS:DATA PUSH DS SUB AX,AX PUSH AX

MOV AX,DATA MOV DS,AX

MOV DX,OFFSET OBF MOV AH,10 INT 21H

MOV AL,OBF+1 · ·18

CMP AL,1 JA NEX2

MOV CL,OBF+2 AND CL,0FH JMP NEX1

NEX2: MOV AL,OBF+2 AND AL,0FH MOV CL,10 MUL CL

MOV AH,OBF+3 AND AH,0FH ADD AL,AH MOV CL,AL

NEX1: MOV CH,0 CMP CX,3 JB ONE SUB CX,2

MOV AX,1 MOV BX,1 AGAIN: MOV DX,AX ADD AX,BX MOV BX,DX LOOP AGAIN

MOV BX,7 MOV A[BX],'$' MOV CX,10 AG: MOV DX,0 DIV CX OR DL,30H DEC BX

MOV A[BX],DL AND AX,AX JNZ AG SUB BX,2

MOV WORD PTR A[BX],0A0DH MOV DX,BX

ADD DX,OFFSET A

19··

MOV AH,9 INT 21H JMP LAST

ONE: MOV DL,0AH MOV AH,2 INT 21H

MOV DL,31H MOV AH,2 INT 21H

LAST: RET

BEGIN ENDP CODE ENDS END BEGIN

24.C语言是如何实现可变参数的函数的?举例说明。

答:C语言的参数传递使用的是堆栈传递方法,而且C语言的参数入栈次序是从右往左的,这样不同于Pascal等语言从参数表按自左至右的次序入栈。由于堆栈后入先出的特点,自左至右的次序入栈就决定了出栈的第一个参数就是最后一个参数,也就不可能支持可变参数了。而C语言参数自右往左入栈,那么出栈的第一个参数就是函数的第一个参数,到参数全部出栈后才能确定所有函数参数,因此实现了可变参数的函数。

25.请说明宏和子程序的主要区别有哪些。一般在什么情况下选用宏较好,在什么情况下选用子程序较好?

答:宏和子程序的区别在于:子程序是CALL和RET指令的执行结果,是在程序执行过程中处理的,一般来说,子程序的多次调用比不用子程序要节省代码;而宏是在汇编过程中进行宏展开的效果,并不节省代码。宏可以用来实现对指令、系统调用或子程序调用等进行功能扩充,便于应用于模块功能实现的情况;对于多次引用的相同程序段可以独立的编成子程序,当需要执行这个程序段时,可以使用调用指令调用它。

26.在宏调用时,是否要求实参与形参的个数相等?若不要求,当个数不一致时会出现什么情况?

答:不要求实参的个数与形参的个数相等。当实参的个数多于形参的个数时,多出的实参被忽略;当实参的个数少于形参的个数时,没有实参对应的形参则用“空”来对应。 27.宏应如何正确使用标号?

答:宏定义中的标号需要使用伪指令LOCAL来说明标号是局部标号,这样汇编程序在每次进行宏展开时,总是把由LOCAL说明的标号用一个唯一的标号代替,从而可以避免标号重复定义的错误。

28.定义宏指令FINSUM:比较两个数X和Y,若X>Y,则执行SUM=X + 2 * Y,否则,执行SUM=2 * X + Y。 · ·20

29.使用条件汇编的目的是什么?

答:宏定义中的标号需要使用伪指令LOCAL来说明标号是局部标号,这样汇编程序在每次进行宏展开时,总是把由LOCAL说明的标号用一个唯一的标号代替,从而可以避免标号重复定义的错误。

30.编写只有一个形式参数的宏PRINT,其具体功能如下:

(1)若引用时带有参数,则在屏幕上显示其参数字符,例如,若PRINT'A',则显

示字符A;

(2)若引用时不带实参,则显示回车和换行,例如,PRINT。

31.一个学生的信息包括姓名、班级、学号、成绩,其中成绩需要精确到1位小数。试编写程序实现以下功能:

(1)可以录入学生成绩(十进制形式);

(2)可以按要求(如学号或成绩)进行排序显示; (3)可以统计平均成绩;

(4)可以统计不及格、60~70、70~80、80~90、90~100各分数段的人数。 提示:应该以上往下规划程序结构,划分各个子程序的功能和调用关系。

·21·

29.使用条件汇编的目的是什么?

答:宏定义中的标号需要使用伪指令LOCAL来说明标号是局部标号,这样汇编程序在每次进行宏展开时,总是把由LOCAL说明的标号用一个唯一的标号代替,从而可以避免标号重复定义的错误。

30.编写只有一个形式参数的宏PRINT,其具体功能如下:

(1)若引用时带有参数,则在屏幕上显示其参数字符,例如,若PRINT'A',则显

示字符A;

(2)若引用时不带实参,则显示回车和换行,例如,PRINT。

31.一个学生的信息包括姓名、班级、学号、成绩,其中成绩需要精确到1位小数。试编写程序实现以下功能:

(1)可以录入学生成绩(十进制形式);

(2)可以按要求(如学号或成绩)进行排序显示; (3)可以统计平均成绩;

(4)可以统计不及格、60~70、70~80、80~90、90~100各分数段的人数。 提示:应该以上往下规划程序结构,划分各个子程序的功能和调用关系。

·21·

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

Top