xv6-labs-2021:traps RISC-V assembly

Which registers contain arguments to functions? For example, which register holds 13 in main's call to printf?

译:哪些寄存器包含函数的参数?例如,哪个寄存器在main对 printf 的调用中保存13?

答:参数传递,显然是a0-a7,由下代码中li a2,13可知,a2存放13.

  printf("%d %d\n", f(8)+1, 13);
  24:	4635                	li	a2,13
  26:	45b1                	li	a1,12
  28:	00000517          	auipc	a0,0x0
  2c:	7a050513          	addi	a0,a0,1952 # 7c8 <malloc+0xe8>
  30:	00000097          	auipc	ra,0x0
  34:	5f8080e7          	jalr	1528(ra) # 628 <printf>

Where is the call to function f in the assembly code for main? Where is the call to g? (Hint: the compiler may inline functions.)

译:在main的汇编代码中,对函数 f 的调用在哪里? g 的调用在哪里? (Hint:The 编译器可以内联函数。)

答:这里没有调用,编译器直接优化了。从上代码中li a1,12,可知。没有对f函数的调用,传入的是计算结果值12。

At what address is the function printf located?

译:函数 printf 位于哪个地址?

答:这个auipc是把0x0左移12位,再加上PC值0x30存到ra里。jalr是先根据ra算出跳转地址,再把现在的PC+4存入ra,作为稍后printf的返回地址。所以printf的位置是0x30+1528=0x628。(后面注释也写了)注意这个值是会变的,不同的环境可能不一样。

What value is in the register ra just after the jalr to printf in main?

译:在 main 中的 jalr 到 printf 之后,寄存器 ra 中的值是什么?

答:0x34+4=0x38;也就是jalr的下一条地址。

Run the following code.。。。。。。。

unsigned int i = 0x00646c72;
printf("H%x Wo%s", 57616, &i);

答:HE110 World:57616用16进制表示为E110。小端模式:高字节存放在高地址,读取i的时候,从低地址开始读取,即,先读了72(r),然后读6c(l)之后是64(d)。若变成大段模式:高字节对应低地址,i=0x00726c64。

In the following code, what is going to be printed after 'y='? (note: the answer is not a specific value.) Why does this happen?

 printf("x=%d y=%d", 3);

译:在下面的代码中, 'y='? (note:答案不是特定值。) 为什么 会发生这种事吗?

答:x=3,y=1。y是a2的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值