昨天看书遇到理解模糊的一段文字,在新浪微博联系到 @华章计算机科学 提出下面我对《CSAPP》第二版中一处译文的理解,今天马上就获得了译者在 豆瓣的回复,在这里。这说明了出版社和译者都同样重视本书。的确,这本书真的非常值得(尽管我才细细读了百来页),网购花了我 81 元。不过,今天刚好有个非常好的消息,华章在新浪微博广告该书的 最后一轮团购,看这里,只需要 60 元(早该这样子大优惠啦)。有价值的好消息不妨广而告之一下,相信读完书之后我们都会有所得。其实51CTO读书频道也有这本书的 试读,看这里(我常在这里获得多本向图书馆推荐的书目)。下面是我在豆瓣该一段译文的个人理解和解释。

 
~ 第二版 P154 中倒数第二段,如下摘抄: 
 
【这段代码从 caller 的栈帧中取出它的参数。因为帧指针已经移动,这些参数的位置也从相对于 %esp 的旧值 +4 和 0 的位置移到了相对于 %ebp 的新值 +12 和 +8 的位置。】 
 
如果我的理解没错的话,上面的描述是说 “这些参数的位置” “移到了” 新的位置。但我根据上下文的理解是:“这些参数” 指的是 &arg1 和 &arg2 ,它们是采用了 “调用者保存寄存器”保存在调用者帧栈中,而子过程要调用时只是因为【帧指针 %ebp 和栈指针 %esp 都移动了】,所以相比【旧】的这两个指针的值,如果现在要访问这两个参数,则会变成相对于【新】的指针的值加上【不同的偏移量】(只是不同的偏移量而已)。 
 
所以我认为,译文中说“这些参数的位置” “移到了” 新的位置似乎有点问题。另一个观点是:调用子过程时帧指针 %ebp 和栈指针 %esp 都移动之后,子过程想要访问的应该是【实参】(文中的代码是以指针传递参数的),而【实参】实际上还是待在【原来的内存地址】,根本没有移动到哪里去。 
 
而文中翻译为“参数的位置“ ”移到了...“ 是不是表明参数被拷贝后重新存储在新的内存地址呢?我想应该不是吧? 
 
在图书馆找来第一版的英文原版看了一下此段的描述,摘抄如下: 
 
Body code in swap_add 
 
1 movl 【8(%ebp)】, %edx Get xp 
2 movl 【12(%ebp)】,%ecx Get yp 
3 movl (%edx), %ebx Get x 
4 movl (%ecx), %eax Get y 
5 movl %eax, (%edx) Store y at *xp 
6 movl %ebx, (%ecx) Store x at *yp 
7 addl %ebx, %eax Set return value = x+y 
 
This code retrieves its arguments from the stack frame for caller. Since the frame pointer has 【shifted】, the【locations】 of these arguments has 【shifted】 from 【positions】 12 and 16 relative to the old value of %ebp to 【positions】 +12 and+8 relative to new value of %ebp.  

 
请注意我在原文中加上方括号的单词,shift 可翻译为 ”移动、改变“ 之意,个人认为,第一个 shifted 确实偏向于 ”移动“ 之意,因为 【帧指针的确移动了】;而第二个 shifted 则偏向于 ”改变、变化“,理由如前面所述,下面结合下一对单词再解释。 
 
location 有 ”定位“ 之意,应该有一个参照点来比较而言,而 position 应该指 ”位置“,它应该是一个确切的、独立的点。 
 
综合上面我对两对单词的理解,【”这些参数的位置“ 应该是指上面的代码段第1、2 行在访问参数时所用的偏移量(联系上下文来理解)】,上面已经说了参数的位置(内存地址)没有移动,所以【第二个 shifted 可能译为”改变、变化“(相对于前面调用者帧段的访问来说)更好】,而不是 ”移到了“。 
 
我对此段的理解可译为如下: 
 
”因为帧指针已经移动,【对这些参数的定位】也从相对于 %esp 的旧值 +4 和 0 的位置【变成了】相对于 %ebp 的新值 +12 和 +8 的位置。“ 
 
不知道自己的理解有无差错,如果有错希望指正,谢谢! 
 
  译者龚老师的回复:
  2010-12-01 12:00:08 conjee
    你的理解是对的。指针移动了,但是内容并没有动,只是内容相对于指针的位置发生了变化。 
我当时的翻译确实没有考虑得像你现在分析的这么周到。 
--龚奕利