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;
}
P71
#include <stdio.h>
#define BUF_SIZE 114
void good_echo(void){
char buf[BUF_SIZE];
while(1){
char* p = fgets(buf,BUF_SIZE,stdin);
if(p==NULL){
break;
}
printf("%s",p);
}
return;
}
int main(){
good_echo();
return 0;
}
P72
- A
n为奇数:
n为偶数:
- B
- C
which | e1 | n | s1 |
---|---|---|---|
least | 1 | even | n%16==1 |
greatest | 24 | odd | n%16==0 |
- D
p=16,m是大于等于8n的最小的16的倍数。
P73
vxorps %xmm1, %xmm1, %xmm1
vucomiss %xmm1, %xmm0
jp .P
ja .A
jb .B
je .E
.A:
movl $2, %eax
jmp .Done
.B:
movl $0, %eax
jmp .Done
.E:
movl $1, %eax
jmp .Done
P:
movl $3, %eax
.Done
我瞎写的,没经过验证,慎用。
P74
vxorps %xmm1, %xmm1, %xmm1
movq $1, %rax
movq $2, %r8
movq $0, %r9
movq $3, %r10
vucomiss %xmm1, %xmm0
cmovaq %r8, %rax"
cmovbq %r9, %rax
cmovpq %r10, %rax
这也是瞎写的,慎用。
P75
- A
n | 实部 | 虚部 |
---|---|---|
1 | %xmm0 | %xmm1 |
2 | %xmm2 | %xmm3 |
3 | %xmm4 | %xmm5 |
n | … | … |
- B
%xmm0是实部,%xmm1是虚部