讨论一下译词似乎不当的地方
这篇书评可能有关键情节透露
~ 第二版 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 的位置。“
不知道自己的理解有无差错,如果有错希望指正,谢谢!
另:为啥 douban 的评价里面只能是简单的文字呢?字体加粗、背景色都不能用,写出这种有区别性的文字时挺难分辨的。
【这段代码从 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 的位置。“
不知道自己的理解有无差错,如果有错希望指正,谢谢!
另:为啥 douban 的评价里面只能是简单的文字呢?字体加粗、背景色都不能用,写出这种有区别性的文字时挺难分辨的。