深入理解计算机系统——第三章小结(3)

很久没继续写CS:APP了,今天来结束第三章

首先是两个新手向的问题

1. void (*f)(int *)

这里从f开始往外看,可以看出是一个指向以(int *)参数的函数的函数指针,返回void. 
具体细节在以为有说,可以翻阅CS:APP和C标签
2. 向过程传递参数. 许多语言提供两种方式传递参数,传值(by value)和引用(by reference)
这也许不是一个很难的概念,C中默认的传递都是传值的,可以使用指针实现引用,
但是面向对象语言更喜欢引用,尤其是在Java时。
//尽管很多人认为C++加入引用是一个错误。

写操作系统是会遇到在C内内嵌汇编的工作,并不是因为汇编更高效很多,
实际上是需要自己实现底层细节。
但普遍的来说,如果需要检查寄存器(尤其是标志位)的情况时,内嵌汇编也是可以承受的。
注意一般使用的为Asm 的扩展嵌入汇编格式:

int ok_smu13(unsigned x, unsigned y, unsigned *dest)
{
   int result;
   asm("movl %2, %%eax; mull %3; movl %%eax, %0;
     setae %%dl; movzbl %%dl, %1"
   : "=r" (*dest), "=r" (result)
   : "r" (x), "r" (y)
   : "%eax", "edx"
   );

 return result;
}

上面的代码实现了mull实现的无符号乘法,汇编代码的扩展格式中,
第一行表示结果会存入,第二行表示读取数据,第三行表示会改动的寄存器。
对于"=r"的解释是“会对其进行复制的读取” 。
此条目发表在C, C++, 系统分类目录,贴了标签。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注