CSAPP第4章家庭作业参考答案

4.45
不正确
push %rsp的指令会将rsp减8之前的old value压栈
应该是如下代码:
movq REG, -8(%rsp)
sub $8, %rsp

4.46
不正确
应该改为
add $8, %rsp
movq -8(%rsp), REG

4.47

#include<stdio.h>
long int a[100] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};

void bubble_b(long *data, long count){
    long i, last;
    long *p0; //data[i]
    long *p1; //data[i+1]

    for(last = count-1; last > 0; last--){
        p0 = data;
        p1 = data + 1;
        for(i = 0; i < last; i++){
            if(*p1 < *p0){
                long t = *p1;
                *p1 = *p0;
                *p0 = t;
            }
            p0++;
            p1++;
        }
    }
}

int main(){
    printf("Before sorting:");
    for(int i = 0; i < 10; i++){
        printf("%ld ", a[i]);
    }
    printf("\n");
    bubble_b(a, 10);
    printf("After sorting:");
    for(int i = 0; i < 10; i++){
        printf("%ld ", a[i]);
    }
    printf("\n");
    return 0;
}

测试结果:

x86-64汇编程序:

0000000000001169 <bubble_b>:
    1169:	f3 0f 1e fa          	endbr64 
    116d:	55                   	push   %rbp
    116e:	48 89 e5             	mov    %rsp,%rbp
    1171:	48 89 7d c8          	mov    %rdi,-0x38(%rbp)
    1175:	48 89 75 c0          	mov    %rsi,-0x40(%rbp)
    1179:	48 8b 45 c0          	mov    -0x40(%rbp),%rax
    117d:	48 83 e8 01          	sub    $0x1,%rax
    1181:	48 89 45 e0          	mov    %rax,-0x20(%rbp)
    1185:	eb 73                	jmp    11fa <bubble_b+0x91>
    1187:	48 8b 45 c8          	mov    -0x38(%rbp),%rax
    118b:	48 89 45 e8          	mov    %rax,-0x18(%rbp)
    118f:	48 8b 45 c8          	mov    -0x38(%rbp),%rax
    1193:	48 83 c0 08          	add    $0x8,%rax
    1197:	48 89 45 f0          	mov    %rax,-0x10(%rbp)
    119b:	48 c7 45 d8 00 00 00 	movq   $0x0,-0x28(%rbp)
    11a2:	00 
    11a3:	eb 46                	jmp    11eb <bubble_b+0x82>
    11a5:	48 8b 45 f0          	mov    -0x10(%rbp),%rax
    11a9:	48 8b 10             	mov    (%rax),%rdx
    11ac:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
    11b0:	48 8b 00             	mov    (%rax),%rax
    11b3:	48 39 c2             	cmp    %rax,%rdx
    11b6:	7d 24                	jge    11dc <bubble_b+0x73>
    11b8:	48 8b 45 f0          	mov    -0x10(%rbp),%rax
    11bc:	48 8b 00             	mov    (%rax),%rax
    11bf:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
    11c3:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
    11c7:	48 8b 10             	mov    (%rax),%rdx
    11ca:	48 8b 45 f0          	mov    -0x10(%rbp),%rax
    11ce:	48 89 10             	mov    %rdx,(%rax)
    11d1:	48 8b 45 e8          	mov    -0x18(%rbp),%rax
    11d5:	48 8b 55 f8          	mov    -0x8(%rbp),%rdx
    11d9:	48 89 10             	mov    %rdx,(%rax)
    11dc:	48 83 45 e8 08       	addq   $0x8,-0x18(%rbp)
    11e1:	48 83 45 f0 08       	addq   $0x8,-0x10(%rbp)
    11e6:	48 83 45 d8 01       	addq   $0x1,-0x28(%rbp)
    11eb:	48 8b 45 d8          	mov    -0x28(%rbp),%rax
    11ef:	48 3b 45 e0          	cmp    -0x20(%rbp),%rax
    11f3:	7c b0                	jl     11a5 <bubble_b+0x3c>
    11f5:	48 83 6d e0 01       	subq   $0x1,-0x20(%rbp)
    11fa:	48 83 7d e0 00       	cmpq   $0x0,-0x20(%rbp)
    11ff:	7f 86                	jg     1187 <bubble_b+0x1e>
    1201:	90                   	nop
    1202:	90                   	nop
    1203:	5d                   	pop    %rbp
    1204:	c3                   	retq  

Y86-64汇编:

pushq %rbp
rrmovq %rsp, %rbp
rmmovq %rdi,-0x38(%rbp)
rmmovq %rsi,-0x40(%rbp)
mrmovq -0x40(%rbp),%rax
irmovq $0x1, %r8
subq %r8, %rax
rmmovq %rax,-0x20(%rbp)
jmp L1
.L5:
mrmovq -0x38(%rbp),%rax
rmmovq %rax,-0x18(%rbp)
mrmovq -0x38(%rbp),%rax
irmovq $0x8, %r8
addq %r8, %rax
rmmovq %rax,-0x10(%rbp)
irmovq $0x0, %r8
rmmovq %r8, -0x28(%rbp)
jmp L2
.L4:
mrmovq -0x10(%rbp),%rax
mrmovq (%rax),%rdx
mrmovq -0x18(%rbp),%rax
mrmovq (%rax),%rax
rrmovq %rdx, %r8
subq %rax,%r8
jge L3
mrmovq -0x10(%rbp),%rax
mrmovq (%rax),%rax
rmmovq %rax,-0x8(%rbp)
mrmovq -0x18(%rbp),%rax
mrmovq (%rax),%rdx
mrmovq -0x10(%rbp),%rax
rmmovq %rdx,(%rax)
mrmovq -0x18(%rbp),%rax
mrmovq -0x8(%rbp),%rdx
rmmovq %rdx,(%rax)
.L3:
irmovq $0x8, %r8
mrmovq -0x18(%rbp), %r9
addq %r8, %r9
rmmovq %r9 -0x18(%rbp)
irmovq $0x8, %r8
mrmovq -0x10(%rbp), %r9
addq %r8, %r9
rmmovq %r9, -0x10(%rbp)
irmovq $0x1, %r8
mrmovq -0x28(%rbp), %r9
addq %r8, %r9
rmmovq %r9, -0x28(%rbp)
.L2:
mrmovq -0x28(%rbp),%rax
mrmovq -0x20(%rbp), %r8
rrmovq %rax, %r9
subq %r8, %r9
jl L4
irmovq $0x1, %r8
mrmovq -0x20(%rbp), %r9
subq %r8, %r9
rmmovq %r9, -0x20(%rbp)
.L1:
mrmovq -0x20(%rbp), %r9
irmovq $0x0, %r8
subq %r8, %r9
jg L5
popq %rbp
ret

4.51
iaddq V, rB c 0 F rB V
取指:
icode:ifun ← \leftarrow M1[PC]
rA:rB ← \leftarrow M1[PC+1]
valC ← \leftarrow M8[PC+2]
valP ← \leftarrow PC + 10

译码:
valB ← \leftarrow R[rB]

执行:
valE ← \leftarrow valB + valC
Set CC

访存:
写回:
R[rB] ← \leftarrow valE
更新PC:
PC ← \leftarrow valP

4.55

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值