1、嵌入式系统设计师-61 及答案解析(总分:45.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)【说明】 本题由两部分组成,第一部分为计算 AX寄存器的值,第二部分为判错题。(分数:15.00)(1).【问题 1】 已知 DS=2000H,BX=0100H,SI=0002H,存储单元20100H到20103H依次存放12H、34H、56H、78H,21200H21203H依次存放 2AH、4CH、B7H、65H,说明下列每一条指令执行后AX寄存器的内容。 (1)MOV AX,1200H (2)MOV AX,BX (3)MOV AX,BX+1100H (4)MOV AX,B
2、X+SI (5)MOV AX,BXSI+1100H(分数:7.50)_(2).【问题 2】 下列 MOV指令都是错误的,请指出错误原因。 (1)MOV ES, 1234H (2)MOV AL, 300 (3)MOV SP, AX (4)MOV AX, BX+DI (5)MOV 20H, AH(分数:7.50)_二、试题二(总题数:1,分数:15.00)【说明】 某测试设备是一个嵌入式系统,是为了测试一个专用设备而研制的,如下图所示。测试设备用于测试被测设备的各项软、硬件功能,包括 2路 RS232串口、2 路模拟量、电源以及专用设备的其他内部部件。在被测专用设备内部有专门的自检测程序,来测试内
3、部各部件。测试设备的串口与被测设备相连接,加电后,通过按测试设备的周边键与被测设备握手同步,再向被测设备发送检测消息,被测设备测试自己的某项功能后,通过串口将测试结果发回给测试设备,显示在测试设备的 LCD屏上。 测试设备的硬件由处理器模块、IO 模块和电源模块组成,处理器模块上有 CPU、存储器、2 路串口、键盘控制器;IO 模块上有 D/A、A/D 转换器,用作为模拟量输入和采集电源的电压值,以测试被测设备的模拟量和电源;电源模块提供测试设备的电源;测试设备模块间采用 ISA总线。 测试设备的 2路串口与被测设备相连,同时测试设备的 D/A、A/D 转换控制器的输入线路与被测设备的模拟量和
4、电源线相连,可直接测试被测设备的 2路 RS232串口、2 路模拟量、电源。 测试设备的软件由底层驱动(串口驱动、D/A、A/D 驱动和自定义键盘驱动)、嵌入式操作系统和测试软件组成。 (分数:15.00)(1).【问题 1】 设存储器容量为 4兆字,字长 32位,模块数为 4,分别用顺序方式和交叉方式进行组织,存储周期为200ns,数据线宽度 32位,总线传送周期为 50ns,请计算顺序存储器和交叉存储器的平均存取时间(单位:ns)和带宽(单位:位/秒)。(分数:3.75)_(2).【问题 2】 测试设备的软件工作过程为:测试设备和被测设备同时加电,测试设备的操作系统启动后自动执行测试程序。
5、测试程序首先采集被测设备的电源是否正常,并在屏幕显示测试信息。如果被测设备正常,则向被测设备发送握手消息,与被测设备同步;如果同步不上,则报“不能与设备同步”,测试结束。接下来,测试程序接收周边键命令,按要求测试。如果测试 2路模拟量,则由测试设备通过 D/A转换,向被测设备发送模拟信号,被测设备得到模拟信号,判断正确性后,通过串口将结果返回给测试设备。另外,被测设备还有 4个功能项是通过串口发送测试命令给被测设备的,由被测设备内的自测试程序测试后,将结果再通过串口传回给测试设备。 请完成下图所示的流程图,按编号将正确答案填写在对应栏中。 (分数:3.75)_(3).【问题 3】 请把下面列出
6、的 6个空位的答案填入相应的位置。 1ISA 总线为 _3_ 位总线。 2由模拟信号到数字信号的转换过程称为 _4_ 。 3将数字信号变成模拟信号的过程称为 _5_ 。 4D/A 转换器的主要性能指标有 _6_ 、 _7_ 、 _8_ 。(回答其中的三个主要性能指标即可)(分数:3.75)_(4).【问题 4】 在本测试设备的异步串行传输中,数据格式为:数据位 8位、奇校验位 1位、停止位 1位。当波特率为9600b/s时,每秒钟传送的有效数据是多少字节?为保证数据收发正确,试分析发送方和接收方时钟允许的误差范围,并以百分比形式给出最大误差。(分数:3.75)_三、试题三(总题数:1,分数:1
7、5.00)【说明】 在嵌入式操作系统设备管理的实现上,常使用到 C语言的函数指针变量,由统一的管理函数调用不同的设备驱动程序。下面的一段 C语言代码是驱动管理程序 manage_device 调用 4个不同设备驱动程序,但没有用到函数指针变量。 【C 语言代码】 /*变量与类型说明*/ #include “stdio.h“ #include “stdlib.h“ extern int sys_status; extern int Dev_drv1(int arg1, int arg2); extern int Dev_drv2(int arg1, int arg2); extern int D
8、ev_drv3(int arg1, int arg2); extern int Dev_drv4(int arg1, iht arg2); #define NOERROR 0 type struct int _fd; TYP_DEV_TAB; TYP DEV_TAB dev_tab50= 101,99, 80, 120,; /*程序代码*/ void manage_device(int devid, int arg1, int arg2) int place ; int ret; for(place=0 ; place50 ; place+) if dev_tab place. fd = de
9、vid) break; if(place=50) printf(“ NO DEVICE fd = %dn “,devid); switch(dev_tab place._fd) case 80: ret = Dev_drv3(int arg1,int arg2); break; case 99: ret = Dev_drv2(int arg1,int arg2); break; case 101: ret = Dev_drv1(int arg1,int arg2); break; case 120: ret = Dev_drv4(int arg1,int arg2); break; if (r
10、et!=NOERROR) printf(“ DEVICE %d error!n “, devid); int Dev_drv1(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/ int Dev_drv2(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/ int Dev_drv3(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/ int Dev_drv4(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/(分数:15.00)(1).【问题
11、1】 请用 C语言的函数指针变量,对 manage_device函数进行改造,完成下面 C语言代码中的(1)、(2)、(3)和(4)处的变量说明或语句,将解答填入对应栏内。 【C 语言代码】 /*变量与类型说明*/ #include “stdio.h“ #include “stdlib.h“ extern int sys_status; extern int Dev_drv1(int arg1, int arg2); extern int Dev_drv2(int arg1, iht arg2); extern int Dev_drv3(int arg1, int arg2); extern
12、int Dev_drv4(int arg1, int arg2); #define NOERROR 0 typedef struct int _fd; (1) 函数指针变量说明;/* 变量名用 process */ TYP_DEV_TAB; TYP_DEV_TAB dev_tab50= 101, Dev_drv1,99, Dev_drv2, 80, Dev_drv3,120, Dev_dry4,; /* 程序 */ void manage_device(int devid, int arg1, int arg2) iht place ; int ret; (2) 函数指针变量说明;/*局部变量
13、,变量名用 ProcAction */ for(place=0 ; place50 ; place+) if(dev_tab place._fd = devid) (3) 语句 1;/* 变量名胜 ProcAction, 得到具体函数的入口地址 */ break; if(place=50) printf(“NO DEVICE fd = %dn“,devid); (4) 语句 2; if(ret!=NOERROR) printf(“DEVICE %d error!“, devid); (分数:3.75)_(2).【问题 2】 在 C语言程序中,常在某些变量的说明前加 extem,如本题在变量说明
14、中的第一条加 extem int sys_stams;请说明加 extem与不加 extem的区别,在进行编译时会有什么样的不同处理?(分数:3.75)_(3).【问题 3】 函数的参数存放在什么地址空间中?说明其作用范围。将答案填入对应栏内。(分数:3.75)_(4).【问题 4】 在设备驱动程序(函数)Dev_drv1 中,对指针 ptr的说明如下: 【C 语文代码】 int Dev_drv1(int arg1,int arg2 ) struct node int ID; char name 20; int range; ; struct node *ptr; /*其他局部变量声明,略*/
15、 ptr = (struct node *)malloc(sizeof(struct node)*100); /*其他程序代码,略*/ 设 int为 32位整数,char 占 8位。当对指针 ptr赋完值后的值为 0x3751CO,若再执行一条“ptr+;”语句,此时 ptr的值为多少? (用十六进制表示)。(分数:3.75)_嵌入式系统设计师-61 答案解析(总分:45.00,做题时间:90 分钟)一、试题一(总题数:1,分数:15.00)【说明】 本题由两部分组成,第一部分为计算 AX寄存器的值,第二部分为判错题。(分数:15.00)(1).【问题 1】 已知 DS=2000H,BX=01
16、00H,SI=0002H,存储单元20100H到20103H依次存放12H、34H、56H、78H,21200H21203H依次存放 2AH、4CH、B7H、65H,说明下列每一条指令执行后AX寄存器的内容。 (1)MOV AX,1200H (2)MOV AX,BX (3)MOV AX,BX+1100H (4)MOV AX,BX+SI (5)MOV AX,BXSI+1100H(分数:7.50)_正确答案:()解析:(1)4C2AH (2)3412H (3)4C2AH (4)7856H (5)65B7H 解析 本问题主要考查汇编语言中数据寻址方式,寻址方式是寻找指令中用于说明操作数所在地址的方法
17、,或者是寻找操作数有效地址的方法。包括数据寻址和转移地址寻址两大类。本问题的具体解析如下: MOV AX,1200H 为直接寻址,对应的物理地址为:DS10H+200H=21200H,该单元的字内容为 4C2AH,所以该条指令执行后 AX的内容为 4C2AH。 MOV AX,BX 为寄存器间接寻址,对应的物理地址为:DS10H+BX=20100H,该单元的字内容为 3412H,所以该条指令执行后 AX的内容为 3412H。 MOV AX,BX+1100H 为寄存器相对寻址,对应的物理地址为:DS10H+BX+1100H=21200H,该单元的内容为 4C2AH,所以该条指令执行后 AX的内容为
18、 4C2AH。 MOV AX,BX+SI 为基址变址寻址,对应的物理地址为:DS10H+BX+SI=20102H,该单元的字内容为 7856H,所以该条指令执行后 AX的内容为 7856H。 MOV AX,BXSI+1100H 为基址变址相对寻址,对应的物理地址为:DS10H+BX+SI+1100H=21202H,该单元字的内容为 65B7H,所以该条指令执行后 AX的内容为 65B7H。(2).【问题 2】 下列 MOV指令都是错误的,请指出错误原因。 (1)MOV ES, 1234H (2)MOV AL, 300 (3)MOV SP, AX (4)MOV AX, BX+DI (5)MOV
19、20H, AH(分数:7.50)_正确答案:()解析:(1)立即数不能直接赋给段寄存器。 (2)立即数 300超过 8位,不能赋给 8位寄存器 AL。 (3)SP不能作为间接寻址寄存器寻址。 (4)两个寄存器不能相加。 (5)立即数不能作为目标操作数。 解析 本问题主要考查汇编语言的基础知识。在 8086的指令系统中,应用通用传送指令时,需要注意以下几点:传送指令可传送 8位数据,也可传送 16位数据,具体取决于指令中涉及的寄存器是 8位还是 16位,也取决于立即数的形式。 传送指令中总是即含源操作数,又含目的操作数,两者之中至少有一个是用寄存器来指出的,这可减少指令长度。因此,一个立即数不能
20、直接送直接寻址的内存单元。交换指令(XCHG)两个操作数都不能是立即数。传送指令不能在两个内存单元之间直接传送数据。 在传送指令中,寄存器即可以作为源操作数,也可以作为目的操作数,但 CS寄存器不能作为目的操作数,换句话说,这个寄存器的值不能随意修改。而 IP寄存器即不能作源操作数,也不能作为目的操作数。 用 BX、SI、DI 来间接寻址时,默认的段寄存器位 DS,而用 BP来间接寻址时,默认的段寄存器为 SS。 8086系统规定,凡是遇到给 SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等到本条指令和下条指令执行后,又自动恢复对 SS寄存器赋值前的中断开放状态。这样做是为了允许程序员连
21、续用两条指令分别对 SS和 SP寄存器赋值,同时又防止堆栈空间变动过程中出现中断。了解这点后,就应注意在修改SS和 SP的指令之间不要插入其他指令。 除了一些直接影响 FLAGS的指令外,一般传送指令不改变标志寄存器的内容。 立即数不能直接送段寄存器 DS、ES 以及 SS,要用通用寄存器或存储单元作桥梁。 因此,指令“MOV ES,1234H”的错误在于立即数直接赋给了段寄存器;指令“MOV AL,300”的错误在于立即数 300超过 8位,不能赋给 8位寄存器 AL;指令“MOVSP,AX”的错误在于 SP不能作为间接寻址寄存器寻址:指令“MOV AX,BX+DI”的错误在于两个寄存器不能
22、相加;指令“MOV 20H,AH”的错误在于立即数不能作为目标操作数。二、试题二(总题数:1,分数:15.00)【说明】 某测试设备是一个嵌入式系统,是为了测试一个专用设备而研制的,如下图所示。测试设备用于测试被测设备的各项软、硬件功能,包括 2路 RS232串口、2 路模拟量、电源以及专用设备的其他内部部件。在被测专用设备内部有专门的自检测程序,来测试内部各部件。测试设备的串口与被测设备相连接,加电后,通过按测试设备的周边键与被测设备握手同步,再向被测设备发送检测消息,被测设备测试自己的某项功能后,通过串口将测试结果发回给测试设备,显示在测试设备的 LCD屏上。 测试设备的硬件由处理器模块、
23、IO 模块和电源模块组成,处理器模块上有 CPU、存储器、2 路串口、键盘控制器;IO 模块上有 D/A、A/D 转换器,用作为模拟量输入和采集电源的电压值,以测试被测设备的模拟量和电源;电源模块提供测试设备的电源;测试设备模块间采用 ISA总线。 测试设备的 2路串口与被测设备相连,同时测试设备的 D/A、A/D 转换控制器的输入线路与被测设备的模拟量和电源线相连,可直接测试被测设备的 2路 RS232串口、2 路模拟量、电源。 测试设备的软件由底层驱动(串口驱动、D/A、A/D 驱动和自定义键盘驱动)、嵌入式操作系统和测试软件组成。 (分数:15.00)(1).【问题 1】 设存储器容量为
24、 4兆字,字长 32位,模块数为 4,分别用顺序方式和交叉方式进行组织,存储周期为200ns,数据线宽度 32位,总线传送周期为 50ns,请计算顺序存储器和交叉存储器的平均存取时间(单位:ns)和带宽(单位:位/秒)。(分数:3.75)_正确答案:()解析:顺序方式平均存取时间 顺序方式平均存取时间为 200ns 交叉方式平均存取时间 交叉方式平均存取时间为 87.5ns 顺序方式带宽 顺序方式带宽为 1610 7 位/秒 交叉方式带宽 交叉方式带宽 36.510 7 位/秒 解析 考查存储器的组织方式和性能计算。 顺序存储器和交叉存储器连续读出 m=4个字的信息总量是:q=32 位4=12
25、8 位 顺序存储器和交叉存储器连续读出 4个字所需的时间分别是: T 2 =mT=4200ns=800ns=810 -7 (s) T 1 =T+(m-1)总线传送周期=200ns+350ns=350ns=3.510 -7 (s) 顺序存储器和交叉存储器的平均存取时间分别是: T 2a =T=200ns T 1a =350ns/4=87.5ns 顺序存储器带宽:W 2 =q/T 2 =128/(810 -7 )=16107(位/秒) 交叉存储器带宽:W 1 =q/T 1 =128/(3.510 -7 )36.510 7 (位/秒)(2).【问题 2】 测试设备的软件工作过程为:测试设备和被测设备
26、同时加电,测试设备的操作系统启动后自动执行测试程序。测试程序首先采集被测设备的电源是否正常,并在屏幕显示测试信息。如果被测设备正常,则向被测设备发送握手消息,与被测设备同步;如果同步不上,则报“不能与设备同步”,测试结束。接下来,测试程序接收周边键命令,按要求测试。如果测试 2路模拟量,则由测试设备通过 D/A转换,向被测设备发送模拟信号,被测设备得到模拟信号,判断正确性后,通过串口将结果返回给测试设备。另外,被测设备还有 4个功能项是通过串口发送测试命令给被测设备的,由被测设备内的自测试程序测试后,将结果再通过串口传回给测试设备。 请完成下图所示的流程图,按编号将正确答案填写在对应栏中。 (
27、分数:3.75)_正确答案:()解析:(1)测试电源。 (2)与测试设备同步。 (3)接收周边键命令。 (4)通过数模转换模块发送模拟量 1给被测设备。 (5)通过数模转换模块发送模拟量 2给被测设备。 (6)通过串口发送测试功能 1命令给被测设备。 (7)通过串口发送测试功能 2命令给被测设备。 (8)通过串口发送测试功能 3命令给被测设备。 (9)通过串口发送测试功能 4命令给被测设备。 解析 考查软件的测试流程,依据题意以及问题 2描述的测试过程,其完整的测试软件流程图如下图所示。 (3).【问题 3】 请把下面列出的 6个空位的答案填入相应的位置。 1ISA 总线为 _3_ 位总线。
28、2由模拟信号到数字信号的转换过程称为 _4_ 。 3将数字信号变成模拟信号的过程称为 _5_ 。 4D/A 转换器的主要性能指标有 _6_ 、 _7_ 、 _8_ 。(回答其中的三个主要性能指标即可)(分数:3.75)_正确答案:()解析:(1)16 (2)AD 转换,或 A/D转换 (3)DA 转换,或 D/A转换 D/A转换器的主要性能指标除建立时间外,还有分辨率、转换精度、线性误差。所以(1)、(2)、(6)应分别填写上述三个的任意一个(不计次序)。 解析 考查总线及数模转换知识。 ISA总线即工业标准体系结构(Industry Standard Architecture),为 16位总
29、线,是最早出现的微型计算机总线标准,广泛应用于嵌入式系统。 由模拟信号到数字信号的转换过程称为 AD转换,或 A/D转换,或模数转换;将数字信号变成模拟信号的过程称为 DA转换,或 D/A转换,或数模转换。 D/A转换器的主要性能指标有建立时间、分辨率、转换精度、线性误差等。(4).【问题 4】 在本测试设备的异步串行传输中,数据格式为:数据位 8位、奇校验位 1位、停止位 1位。当波特率为9600b/s时,每秒钟传送的有效数据是多少字节?为保证数据收发正确,试分析发送方和接收方时钟允许的误差范围,并以百分比形式给出最大误差。(分数:3.75)_正确答案:()解析:每秒钟传送的有每秒钟传送的有
30、效数据 9600(1+8+1+1) 827.7字节 分析发送方和接收方时钟允许的最大误差要点 (8+1+1)1/2。 最大误差为 5%。 解析 考查异步数据传输应用知识。 每秒钟传送的有效数据:9600(1+8+1+1)=872.7 字节 分析发送方和接收方时钟允许的最大误差: 在启动位同步后,在 8位数据位、1 位奇校验位、1 位停止位之后累积的最大误差为(8+1+1),该值应小于 1/2位,即(8+1+1)1/2。 因此,最大误差为 5%。三、试题三(总题数:1,分数:15.00)【说明】 在嵌入式操作系统设备管理的实现上,常使用到 C语言的函数指针变量,由统一的管理函数调用不同的设备驱动
31、程序。下面的一段 C语言代码是驱动管理程序 manage_device 调用 4个不同设备驱动程序,但没有用到函数指针变量。 【C 语言代码】 /*变量与类型说明*/ #include “stdio.h“ #include “stdlib.h“ extern int sys_status; extern int Dev_drv1(int arg1, int arg2); extern int Dev_drv2(int arg1, int arg2); extern int Dev_drv3(int arg1, int arg2); extern int Dev_drv4(int arg1, i
32、ht arg2); #define NOERROR 0 type struct int _fd; TYP_DEV_TAB; TYP DEV_TAB dev_tab50= 101,99, 80, 120,; /*程序代码*/ void manage_device(int devid, int arg1, int arg2) int place ; int ret; for(place=0 ; place50 ; place+) if dev_tab place. fd = devid) break; if(place=50) printf(“ NO DEVICE fd = %dn “,devid
33、); switch(dev_tab place._fd) case 80: ret = Dev_drv3(int arg1,int arg2); break; case 99: ret = Dev_drv2(int arg1,int arg2); break; case 101: ret = Dev_drv1(int arg1,int arg2); break; case 120: ret = Dev_drv4(int arg1,int arg2); break; if (ret!=NOERROR) printf(“ DEVICE %d error!n “, devid); int Dev_d
34、rv1(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/ int Dev_drv2(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/ int Dev_drv3(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/ int Dev_drv4(int arg1,int arg2) /*局部变量声明,略*/ /*驱动程序代码,略*/(分数:15.00)(1).【问题 1】 请用 C语言的函数指针变量,对 manage_device函数进行改造,完成下面 C语言代码中的(1)、(2)、(
35、3)和(4)处的变量说明或语句,将解答填入对应栏内。 【C 语言代码】 /*变量与类型说明*/ #include “stdio.h“ #include “stdlib.h“ extern int sys_status; extern int Dev_drv1(int arg1, int arg2); extern int Dev_drv2(int arg1, iht arg2); extern int Dev_drv3(int arg1, int arg2); extern int Dev_drv4(int arg1, int arg2); #define NOERROR 0 typedef
36、struct int _fd; (1) 函数指针变量说明;/* 变量名用 process */ TYP_DEV_TAB; TYP_DEV_TAB dev_tab50= 101, Dev_drv1,99, Dev_drv2, 80, Dev_drv3,120, Dev_dry4,; /* 程序 */ void manage_device(int devid, int arg1, int arg2) iht place ; int ret; (2) 函数指针变量说明;/*局部变量,变量名用 ProcAction */ for(place=0 ; place50 ; place+) if(dev_t
37、ab place._fd = devid) (3) 语句 1;/* 变量名胜 ProcAction, 得到具体函数的入口地址 */ break; if(place=50) printf(“NO DEVICE fd = %dn“,devid); (4) 语句 2; if(ret!=NOERROR) printf(“DEVICE %d error!“, devid); (分数:3.75)_正确答案:()解析:(1)int (*process)(int arg1,int arg2); (2)int (*ProcAction)(int arg1,int arg2); (3)ProcAction=dev
38、_tabplace.process; (4)ret=ProcAction(arg1,arg2); 解析 本题考查对 C语言中函数指针变量的理解和用法。在 C语言中,可以用指针变量指向整型变量、字符串、数组、结构变量,也可以指向一个函数,对指针的用法非常灵活,也很容易出错。其中,函数指针变量为较高级的用法。 一个函数在编译时被分配给一个入口地址,这个入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。 本题已将使用变量指向函数编写设备驱动程序的大部分给出,只需在对函数指针变量的声明和引用处,只需给出正确的用法即可。(2).【问题 2】 在 C语言程序中,常在某些变
39、量的说明前加 extem,如本题在变量说明中的第一条加 extem int sys_stams;请说明加 extem与不加 extem的区别,在进行编译时会有什么样的不同处理?(分数:3.75)_正确答案:()解析:变量加extern与不加extern的区别 在变量志明前加extern,表明为引用一个外部变量,是外部变量引用声明。如果在一个文件中要引用另一文件中定义的全局变量,就应在变量声明前加extern 不加extern,是在本文件中定义了一个全局变量,同时可被其他文件作为外部变量引用 在进行编译时的处理 在不加extern外部变量的定义处,编译时要给变量分配地址空间。在加extern外部
40、变量引用声明处,不给变量分配地址 解析 本题考查对 C语言的变量声明类型的理解。在变量声明前加 extem,表明为引用一个外部变量,是外部变量引用声明,不管该变量在程序的什么位置。如果在一个文件中要引用在另一文件中定义的全局变量,就应在变量声明前加 extem。 如果在一个全局变量前不加 extem,表明该变量是在本文件中定义的一个全局变量,同时可被其他文件作为外部变量引用。 在不加 extem外部变量的定义处,编译时要给变量分配地址空间。在加 extem外部变量引用声明处,不给变量分配地址。 值得注意的是,如果在全局变量的声明前都加 extem,在这种情况下,编译连接时会确定一处分配一次地址
41、空间。(3).【问题 3】 函数的参数存放在什么地址空间中?说明其作用范围。将答案填入对应栏内。(分数:3.75)_正确答案:()解析:函数的参数存放地址空函数的参数存放在进程间 或任务的栈空间 作用范围 在调用函数时,给函数的各参数在栈空间分配地址,函数返回时退出栈空间。所以,函数参数在函数被调用时起作用。解析 本题考查对栈空间基础知识。函数的参数存放在进程或任务的栈空间中,在调用函数时,给函数的各参数在栈空间分配地址;函数返回时退出栈空间。所以,函数参数在函数被调用时起作用。(4).【问题 4】 在设备驱动程序(函数)Dev_drv1 中,对指针 ptr的说明如下: 【C 语文代码】 in
42、t Dev_drv1(int arg1,int arg2 ) struct node int ID; char name 20; int range; ; struct node *ptr; /*其他局部变量声明,略*/ ptr = (struct node *)malloc(sizeof(struct node)*100); /*其他程序代码,略*/ 设 int为 32位整数,char 占 8位。当对指针 ptr赋完值后的值为 0x3751CO,若再执行一条“ptr+;”语句,此时 ptr的值为多少? (用十六进制表示)。(分数:3.75)_正确答案:()解析:ptr 的值为以下均按正确对待。 0x3751DC,或 3751DCH,或十六进制 3751DC,或 3751DC。 解析 本题考查对 C语言指针变量的理解。在指针赋予某一变量的地址后,该指针就指向该变量所分配的地址空间。需要强调的是,指针变量是有类型的,指针的值加 1,表示增加按其声明类型所占的字节数,而不是增加一个字节的地址。因此 ptr+后 ptr的值比原来增加 28个字节,当前的值应为 0x3751DC。
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1