整理自用,持续更新。
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 值,使得栈帧指针回到上一层函数的栈帧状态,这样就完成了栈帧的清理,为函数的正确返回做好了准备。
- 调整栈指针(% esp):
-
与函数返回的关系
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,所以不要直接与。
1687

被折叠的 条评论
为什么被折叠?



