4、【
简答题】
试题四(共10分)
阅读以下有关80X86汇编语言的叙述,回答问题1和问题2,将解答填入答题纸的对应栏内。
【说明】
本题由两部分组成,第一部分为计算AX寄存器的值,第二部分为判错题。
【问题1】(5分)
已知DS=2000H,BX=0100H,SI=0002H,存储单元[20100H]到[20103H]依次存放12H、34H、56H、78H,[21200H]到[21203H]依次存放 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,[BX][SI+1100H]
【问题2】(5分)
下列MOV指令都是错误的,请指出错误原因。
(1) MOV ES,1234H
(2) MOV AL,300
(3) MOV [SP],AX
(4) MOV AX,BX+DI
(5) MOV 20H,AH
[10分]
解析:
5、【
简答题】
试题五(共15分)
阅读以下说明和C语言代码,回答问题1至问题4,将解答填入答题纸的对应栏内。
【说明】
在嵌入式操作系统设备管理的实现上,常使用到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 Dev_drv3(int arg1, int arg2);
extern int Dev_drv4(int arg1, int arg2);
#define NOERROR 0
type struct {
int _fd;
} TYP_DEV_TAB;
TYP_DEV_TAB dev_tab[50]= {101,99, 80, 120,};
/* 程序代码 */
void manage_device(int devid, int arg1, int arg2)
{ int place ;
int ret;
for(place=0 ; place<50 ; place++)
if dev_tab [place]._fd == devid) break;
if(place>=50)
printf(" NO DEVICE fd = %d\n ",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(ret!=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)
{
/* 局部变量声明,略 */
/* 驱动程序代码,略*/
}
【问题1】(8分)
请用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, int arg2);
extern int Dev_drv3(int arg1, int arg2);
extern int Dev_drv4(int arg1, int arg2);
#define NOERROR 0
typedef struct {
int _fd;
(1)函数指针变量说明;/* 变量名用process */
} TYP_DEV_TAB;
TYP_DEV_TAB dev_tab[50]= {{101, Dev_drv1},{99, Dev_drv2},
{80, Dev_drv3},{120, Dev_drv4},};
/* 程序 */
void manage_device(int devid, int arg1, int arg2)
{ int place ;
int ret;
(2)函数指针变量说明;/*局部变量,变量名用ProcAction */
for(place=0 ; place<50 ; place++) {
if(dev_tab [place]._fd == devid) {
(3)语句1;/* 变量名用ProcAction,得到具体函数的入口地址 */
break;
}
}
if(place>=50)
printf("NO DEVICE fd = %d\n",devid);
(4)语句2;
if(ret!=NOERROR)
printf("DEVICE %d error!", devid);
}
【问题2】(3分)
在C语言程序中,常在某些变量的说明前加extern,如本题在变量说明中的第一条加extern int sys_status;请说明加extern与不加extern的区别,在进行编译时会有什么样的不同处理?
【问题3】(2分)
函数的参数存放在什么地址空间中?说明其作用范围。将答案填入答题纸的对应栏内。
【问题4】(2分)
在设备驱动程序(函数)Dev_drv1中,对指针ptr的说明如下:
【C语言代码】
int 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赋完值后的值为0x3751C0,若再执行一条“ptr++;”语句,此时ptr的值为多少?(用十六进制表示)。
[15分]
解析: