作业5
3.32
指令 | 状态值(指令执行前) | |||||||
标号 | PC | 指令 | %rdi | %rsi | %rax | %rsp | *%rsp | 描述 |
M1 | 0x400560 | callq | 10 | — | — | 0x7fffffffe820 | — | 调用first (10) |
F1 | 0x400548 | lea | 10 | — | — | 0x7fffffffe818 | 0x400565 | first函数入口 |
F2 | 0x40054c | sub | 10 | 11 | — | 0x7fffffffe818 | 0x400565 | |
F3 | 0x400550 | callq | 9 | 11 | — | 0x7fffffffe818 | 0x400565 | 调用last (9, 11) |
L1 | 0x400540 | mov | 9 | 11 | — | 0x7fffffffe810 | 0x400555 | last函数入口 |
L2 | 0x400543 | imul | 9 | 11 | 9 | 0x7fffffffe810 | 0x400555 | |
L3 | 0x400547 | retq | 9 | 11 | 99 | 0x7fffffffe810 | 0x400555 | last返回值 99 |
F4 | 0x400555 | repz | 9 | 11 | 99 | 0x7fffffffe818 | 0x400565 | first返回值99 |
M2 | 0x400565 | mov | 9 | 11 | 99 | 0x7fffffffe820 | — | main函数后续 |
3.33
情况1:假设 3 addq %rdi, (%rdx)
是实现 *u += a
,
则易知 a in %edi
, u in %rdx
从而 4 addb %silm, (%rcx)
是实现 *v += b
从而 b in %si
, v in %rcx
,
即四个参数的顺序为 int procprobl(int a, short b, long *u, char *v)
;
情况2:反之,假设 3 addq %rdi, (%rdx)
实现 *v += b
,
则有 b in %edi
, *v in %rdx
从而 4 addb %silm, (%rcx)
是实现 *u += a
从而 a in %si
, u in rcx
即 int procprobl(int b, short a, long *v, char *u)
3.35
A. 保存参数x的值,用来计算表达式结果,保存当前状态
B.
1 | long rfun(unsigned long x) { |
3.38
由
1 | leaq 0(,%rdi,8), %rdx #8i |
可知P为7列,即N=7
由
1 | leaq (%rsi,%rsi,4), %rax #5j |
可知,Q为5列,即M=5
综上,M=5,N=7
3.41
A.
p: 0
s.x: 8
s.y: 12
next: 16
B. 24
C.
1 | void sp_init(struct prob *sp) { |
3.45
A.
a | b | c | d | e | f | g | h |
---|---|---|---|---|---|---|---|
0 | 8 | 16 | 24 | 28 | 32 | 40 | 48 |
B. 56
C.
1 | struct { |
重排的偏移量
d | f | b | e | h | a | c | g |
---|---|---|---|---|---|---|---|
0 | 1 | 2 | 4 | 8 | 16 | 24 | 32 |
大小:40
3.48
A.不带保护者:buf: 0, v: 24;带保护者:buf: 16, v: 8, 金丝雀: 40;
B. 带保护者的模式由于v比buf更接近栈顶,即使缓存区溢出也不会破坏v的值。
3.69
A.
1 | mov 0x120(%rsi),%ecx # bp->last |
CNT=7
B.
1 | typedef struct { |
3.70
A.
e1.p | e1.y | e2.x | e2.next |
---|---|---|---|
0 | 8 | 0 | 8 |
B. 16
C.
1 | void proc(union ele *up) { |