CSAPP-CMU/oldexams

整理自用,持续更新。

exam1-f10-a

problem1.1

强制转换为char:取低8位按有符号数解释。

强制转换为u char:取低8位按无符号数解释。

problem1.3

整型运算中小数点后的部分全部舍去。

problem1.5

1T=-1,01T=1。

problem1.6

么有取地址。程序会出现试图在不正确的内存地址上进行读写操作。

problem1.9

栈帧:C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。栈帧也叫过程活动记录,是编译器用来实现过程函数调用的一种数据结构。

  • 栈帧是一块因函数运行而临时开辟的空间。
  • 每调用一次函数便会创建一个独立栈帧。
  • 栈帧中存放的是函数中的必要信息,如局部变量、函数传参、返回值等。
  • 当函数运行完毕栈帧将会销毁。
  • leave 指令的主要作用 - 栈帧清理

    • 调整栈指针(% esp)leave指令首先会将栈帧指针(% ebp)的值复制到栈指针(% esp)。这一步操作相当于释放了栈帧中为局部变量分配的空间。因为在函数执行过程中,栈指针(% esp)会随着局部变量的入栈而减小(栈是从高地址向低地址生长的),当把 % ebp 的值赋给 % esp 时,就使得栈指针回到了栈帧开始的位置,从而实现了对局部变量存储空间的释放。
    • 恢复上一层栈帧指针(% ebp):在调整栈指针之后,leave指令会弹出栈顶元素并将其赋值给栈帧指针(% ebp)。这个操作是为了恢复上一层栈帧的栈帧指针,因为在进入当前函数时,会先保存上一层栈帧的 % ebp 的值(通过push %ebp操作),然后设置当前函数的 % ebp(通过mov %esp, %ebp操作)。当函数执行完毕,leave指令弹出之前保存的上一层栈帧的 % ebp 值,使得栈帧指针回到上一层函数的栈帧状态,这样就完成了栈帧的清理,为函数的正确返回做好了准备。
  • 与函数返回的关系

    • leave指令通常与ret指令(用于从函数返回)一起使用。leave指令清理栈帧后,ret指令会从栈顶获取返回地址并跳转到该地址,从而使程序的执行流程返回到调用该函数的位置。

leave指令相当于:

mov %ebp,%esp

pop %ebp

problem1.10

想选e。

problem1.12

x86-64采用小端法进行存储。

problem1.19

[○・`Д´・ ○]

arithmetic:算术

problem3

考点是嵌套数组存储结构。

array1[4(3x+y)]:对应x*J+y

array2[4(2^4y-y+x)]:对应y*H+x

所以H=15,J=3。

problem4

看清是32位机器,long、int*、float都是4位。

problem6

注意不满足case的情况下都返回到default(40048a)下。

problem7

注意点:32位机器;strcpy函数没有用到参数a。

简略的栈:

0xdeadbeef

0x080484d0

0x080483fc
0xffffd3e8
buf[1]
buf[0]
str
buf
  • A.a:call与jmp的区别:call调用前会将返回地址压入栈,jmp不会。
  • A.b:ret为什么不携带地址:ret默认从栈顶得到返回地址。
  • B:(本题中没有说明的ebp均指foo函数的栈帧)问题相当于找在caller函数的栈上a的存储位置相对于buf的位置。buf数组起始相对于ebp是-8,而caller栈上的a相对于ebp是+12(ebp存储caller的ebp,ebp+4存储调用函数时PC指向的地址080483fc,ebp+8存储0x800484d0,ebp+12存储0xdeadbeef),int数组每位是4个字节。所以是buf[5]==a。
  • C:0x80484d0
  • D:小端法存储数据(如上图)
  • E:调用新函数前,当前ebp保存的是调用者的栈帧。在注释中给出:0xffffd3e8
  • F:ret前esp指向栈顶保存的调用函数的返回地址:0x80483fc
  • G:不会。‘0123456’加上末尾‘\0’只有八个字节,不超过int buf[2]的存储空间大小

exam1-f11

problem1.2

dereference:间接引用

problem1.3

c:unsigned计算溢出自动截断高位,所以是0。

d:因为a、b均是int型,所以会先按照32位计算加和(同c),再扩展到64位,所以还是0。

problem4

[○・`Д´・ ○]

n==0,两个等于!

problem5

B:esp是栈顶返回地址:0fcc。

      ebp是上个栈帧地址:0fe0。        

problem7

nop:不执行任何操作的计算机协议命令。

exam1-f12

problem1.5

x是32的倍数则返回1,不是则返回0。

需满足x的低5位为1。

problem1.8

局部性原理。

spatial locality:空间局部性。如果一个存储单元被访问,那么它附近的存储单元在不久的将来也很可能被访问。

temporal locality:时间局部性。如果程序中的某条指令被执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。

利用空间局部性访问矩阵。相邻元素被读到缓存中,提高缓存利用率。

problem1.9

c:前6个用寄存器存,多的用栈传递。

d:与32不同,64没有强制要求rbp作为栈帧的基指针,可以像其他寄存器一样使用。

problem4

test:按位与,改变标志位。判断是否为零。

je:相等或等于0跳转。

b相当于标志位:test $0x1, %dl

b==0时跳过了返回值变更值的一步。

problem7

case3、case7时:变c值,case3完了以后要过case7,所以不要直接与。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值