user-0 提问: 深入理解计算机系统里面的一个小疑惑

回复:
user: user-1
content: 了个单词，errata，勘误表

user: user-2
content: 应该是 t = 4 * counter + 6; counter = counter  + 4; return t;

user: user-3
content: 这代码对毛线，勘误表都不看的？明显就是错误代码。查看CSAPP errta

user: user-4
content: 引用 14 楼 bai12345633 的回复:[quote=引用 7 楼 mujiok2003 的回复:] [quote=引用 1 楼 baipv008 的回复:] 应该是书里代码错了  这代码是对的。 以下是gcc 4.7.3 -O3下结果 [/quote]  你列的汇编是正确的，但是理解有问题，你列的代码里面是先把counter的值保存了（也就是4），再利用%eax算出的t，而此时的%eax的值是以前的counter(也就是0)，而不是已经写入内存的4. [/quote] 不是很理解你的意思.我讲讲我的理解    0x004016f0 <+0>:     push   ebp    0x004016f1 <+1>:     mov    ebp,esp    0x004016f3 <+3>:     and    esp,0xfffffff0    0x004016f6 <+6>:     sub    esp,0x10    0x004016f9 <+9>:     call   0x4011e0 <__main>    0x004016fe <+14>:    mov    eax,ds:0x404018    0x00401703 <+19>:    mov    DWORD PTR [esp],0x402080    0x0040170a <+26>:    mov    DWORD PTR [esp+0x4],eax    0x0040170e <+30>:    call   0x4011e8 <printf> => 0x00401713 <+35>:    mov    eax,ds:0x404018 // cnt-> eax    0x00401718 <+40>:    lea    edx,[eax+0x4]     0x0040171b <+43>:    mov    DWORD PTR ds:0x404018,edx // cnt += 4     0x00401721 <+49>:    lea    eax,[eax*4+0x6] //返回eax * 4 + 6, 也就是自增前的cnt*4 + 6      0x00401728 <+56>:    leave    0x00401729 <+57>:    ret

user: user-5
content: 引用 20 楼 ForestDB 的回复:http://csapp.cs.cmu.edu/public/errata.html Chapter 5: Optimizing Program Performance     p. 479, Second block of code in aside on “Optimizing function calls by inline substitution”. Line four should read     counter = counter + 4 +1  去看看这本书的勘误表就好了，比较负责的书一般都会有这个。这里很明显是书印错了。

user: user-6
content: http://csapp.cs.cmu.edu/public/errata.html Chapter 5: Optimizing Program Performance     p. 479, Second block of code in aside on “Optimizing function calls by inline substitution”. Line four should read     counter = counter + 4

user: user-7
content: 引用 9 楼 yulinlang 的回复:书错了，应该是counter = counter + 4 反汇编也证明了 mov  eax, ds:0x404018 lea  edx, [eax+0x4] mov  DWORD PTR ds:0x404018  要是这样写还差不多：  int t = counter; counter = t + 4; t = 4 * counter + 6;  你这样又不对了。 应该是：  t = 4 * counter + 6; counter = t + 4; return t;

user: user-7
content: 引用 3 楼 erhou134 的回复:优化后 counter = counter + 4 吧re

user: user-7
content: 引用 16 楼 zhao4zhong1 的回复:[quote=引用 2 楼 maoshuoqiong 的回复:] 赵老师一会回来教导你,不要迷信课本的 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？ [/quote]SB

user: user-8
content: 引用 2 楼 maoshuoqiong 的回复:赵老师一会回来教导你,不要迷信课本的 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-0
content: 引用 7 楼 mujiok2003 的回复:[quote=引用 1 楼 baipv008 的回复:] 应该是书里代码错了  这代码是对的。 以下是gcc 4.7.3 -O3下结果 [/quote]  你列的汇编是正确的，但是理解有问题，你列的代码里面是先把counter的值保存了（也就是4），再利用%eax算出的t，而此时的%eax的值是以前的counter(也就是0)，而不是已经写入内存的4.

user: user-9

user: user-10
content: 引用错误  引用 1 楼 baipv008 的回复:应该是书里代码错了  同意，贩书的人不负责。

user: user-10
content: 引用 楼主 bai12345633 的回复:直接上图：  问题是func1in()怎么能优化成func1opt()呢？counter的值都不一样了啊。不知道有没有看过的朋友知道为什么，本人小菜，谢谢了。counter是全局变量。  同意，贩书的人不负责。

user: user-11
content: 抱歉，上面的写法也是错误的

user: user-11
content: 书错了，应该是counter = counter + 4 反汇编也证明了 mov  eax, ds:0x404018 lea  edx, [eax+0x4] mov  DWORD PTR ds:0x404018  要是这样写还差不多：  int t = counter; counter = t + 4; t = 4 * counter + 6;

user: user-4
content: counter++执行4次后， 相当于counter += 4

user: user-4
content: 引用 1 楼 baipv008 的回复:应该是书里代码错了  这代码是对的。 以下是gcc 4.7.3 -O3下结果

user: user-0
content: 引用 5 楼 user-12 的回复:没看懂。。。。。。。

user: user-12
content: 没看懂。。。。。。。