《CSAPP》(第3版)答案(第三章)(二)

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 
#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
    s 2 = s 1 − [ ( n ∗ 8 + 30 ) & 0 X f f f f f f f 0 ] s_2 = s_1 - [ (n * 8 + 30) \& 0Xfffffff0 ] s2=s1[(n8+30)&0Xfffffff0]
    n为奇数:
    s 2 = s 1 − ( n ∗ 8 + 24 ) s_2 = s_1 - (n * 8 + 24) s2=s1(n8+24)
    n为偶数:
    s 2 = s 1 − ( n ∗ 8 + 16 ) s_2 = s_1 - (n * 8 + 16) s2=s1(n8+16)
  • B
    p = ( s 2 + 15 ) & 0 X F F F F F F F 0 p = (s_2 + 15) \& 0XFFFFFFF0 p=(s2+15)&0XFFFFFFF0
  • 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是虚部

第三章 完

你可能感兴趣的:(CSAPP,c语言,操作系统,反汇编,csapp,自然语言处理)