P67
- A
104 ±-----------------+
| |
| |
| |
| |
| |
| |
| |
| |
64 ±-----------------+ <-- %rdi
| |
| |
| |
| |
| |
| |
32 ±-----------------+
| z |
24 ±-----------------+
| &z |
16 ±-----------------+
| y |
8 ±-----------------+
| x |
0 ±-----------------+ <-- %rsp - B
%rsp+64 - C
%rsp+offset - D
eval 把地址%rsp+64传给进程,进程从该地址开始存储数据,最后返回该地址 - E
104 ±-----------------+
| |
| |
| |
| |
| |
| |
88 ±-----------------+
| z |
80 ±-----------------+
| x |
72 ±-----------------+
| y |
64 ±-----------------+ <-- %rdi(eval pass in)
| |
| | – %rax(process pass out)
| |
| |
| |
| |
32 ±-----------------+
| z |
24 ±-----------------+
| &z |
16 ±-----------------+
| y |
8 ±-----------------+
| x |
0 ±-----------------+ <-- %rsp in eval
| |
-8 ±-----------------+ <-- %rsp in process
(图转自github) - F
调用者给被调用者传递地址和需要的空间大小,被调用者存储数据后,返回传入的地址值。
P68
4 < B <= 8
5 < A <= 10
44 < A*B <= 46
解得 A=9 B=5
P69
- A
CNT=7 - B
typedef struct {
long idx,
long x[4]
} a_struct
P70
- A
val | offset |
---|---|
e1.p | 0 |
e1.y | 8 |
e2.x | 0 |
e2.next | 8 |
- B
16 - C
union ele{
struct{
long* p;
long y;
}e1;
struct{
long x;
union ele* next;
}e2;
};
void proc(union ele* up){
up->e2.x = *(up->e2.next->e1.p) - up->e2.next->e1.y;
}