A. EBX、ESI、ESP都是被调用者保存寄存器 B. 入口参数使用栈传递 C. 返回地址是CALL指令下一条指令的地址,保存在栈中 D. EAX、ECX、EDX都是调用者保存寄存器
A. 只能通过将栈指针ESP作为基址寄存器来访问用户栈的数据 B. 过程嵌套调用深度越深,栈中栈帧个数越多,严重时会发生栈溢出 C. 从被调用过程返回调用过程之前,被调用过程会释放自己的栈帧 D. 每进行一次过程调用,用户栈从高地址向低地址增长出一个栈帧
A. 静态(static型)变量和非静态局部变量(auto型)都分配在对应栈帧中 B. 因为非静态局部变量被分配在栈帧中,所以其作用域仅在过程体内 C. 不同过程中的非静态局部变量可以同名,是因为它们被分配在不同栈帧中 D. 非静态局部变量可以和全局变量同名,是因为它们被分配在不同存储区
A. 变量t1和t2被分配在caller函数的栈帧中 B. 传递参数时t1和t2的值从高地址到底地址依此存入栈中 C. add函数返回时返回值存放在EAX寄存器中 D. 变量sum被分配在caller函数的栈帧中
A. 第1条指令将过程P的EBP内容压入caller栈帧 B. 第2条指令使EBP内容指向caller栈帧的底部 C. 第3条指令将栈指针ESP向高地址方向移动,以生成当前栈帧 D. 从上述指令序列可以看出,caller函数没有使用被调用者保持寄存器
A. 变量t1和t2的有效地址分别为R[ebp]-12和R[ebp]-8 B. 变量t1所在的地址高(或大)于变量 t2所在的地址 C. 参数t1和t2的有效地址分别为R[esp]和R[esp]+4 D. 变量t1所在的地址低(或小)于变量 t2所在的地址
A. leave指令用于恢复EBP的旧值,并不会改变ESP的内容 B. 执行第10条指令的过程中,会把第11条指令的地址压入栈顶 C. 执行第11条指令时,add函数的返回值已经在EAX中 D. 变量sum的有效地址为R[ebp]-4
A. 可能需要执行递归过程很多次,因而时间开销大 B. 每次递归调用都会生成一个新的栈帧,因而空间开销大 C. 每次递归调用在栈帧中保持的返回地址都不相同 D. 递归过程第一个参数的有效地址为R[ebp]+8
A. 对应的then_statement 的代码一定在对应else_statement的代码之前 B. 一定包含一条“无条件转移”指令 C. 一定包含一条“条件转移”指令 D. 计算cond_expr的代码段一定在条件转移指令之前
A. 可以用连续的if~else ~if ~else语句对应的机器级代码来实现switch语句 B. 当case中出现的条件取值范围较小时,可以用跳转表的方式实现 C. 每个case对应的一段代码结束后,都会有一条无条件转移指令 D. 每个case至少对应一条条件转移指令,因而一定会包含多条条件转移指令