`

《深入理解计算机系统》第二章

阅读更多

 

一、布尔代数和环

利用^(异或)的环属性实现变量的交换。

void inplace_swap(int *x, int *y){
      *x = *x ^ *y;
      *y = *x ^ *y;
      *x = *x ^ *y;
}

 正如上面这段程序,看上去是来来回回的同样一种运算甚至连运算数都一样。但是就是这样三行代码达到了交换x和y指向的数据值的效果。

让我们来简单分析一下这个程序的具体过程吧:

步骤 *x *y
初始 a b
第一步 a^b b
第二步 a^b a^b^b=a^0=a
第三步 a^b^a=a^a^b=0^b=b a

 

 

 

 

 

 

 

 

 

不错这样看来,这个程序从表象三看好像是省去了一个空间,但是从汇编码等底层实现上看没有任何性能上的优势。下面我们看看这段代码的汇编码:

 

汇编代码 写道
.file "inplace_swap.c"
.text
.globl inplace_swap
.type inplace_swap, @function
inplace_swap:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
movl (%eax), %edx
movl 12(%ebp), %eax
movl (%eax), %eax
xorl %eax, %edx
movl 8(%ebp), %eax
movl %edx, (%eax)
movl 8(%ebp), %eax
movl (%eax), %edx
movl 12(%ebp), %eax
movl (%eax), %eax
xorl %eax, %edx
movl 12(%ebp), %eax
movl %edx, (%eax)
movl 8(%ebp), %eax
movl (%eax), %edx
movl 12(%ebp), %eax
movl (%eax), %eax
xorl %eax, %edx
movl 8(%ebp), %eax
movl %edx, (%eax)
popl %ebp
ret


.size inplace_swap, .-inplace_swap
.globl swap
.type swap, @function
swap:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %eax
movl (%eax), %edx
movl -4(%ebp), %eax
movl %edx, (%eax)
movl 12(%ebp), %eax
movl (%eax), %edx
movl 8(%ebp), %eax
movl %edx, (%eax)
movl -4(%ebp), %eax
movl (%eax), %edx
movl 12(%ebp), %eax
movl %edx, (%eax)
leave
ret


.size swap, .-swap
.section .rodata
.LC0:
.string "Old: x=%d,y=%d\n"
.LC1:
.string "New: x=%d,y=%d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $36, %esp
movl $1, -8(%ebp)
movl $2, -12(%ebp)
movl -12(%ebp), %eax
movl %eax, 8(%esp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
movl -12(%ebp), %eax
movl -8(%ebp), %edx
movl %eax, 4(%esp)
movl %edx, (%esp)
call inplace_swap
movl -12(%ebp), %eax
movl %eax, 8(%esp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC1, (%esp)
call printf
movl $0, %eax
addl $36, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.2.4 (Ubuntu 4.2.4-1ubuntu1)"
.section .note.GNU-stack,"",@progbits
 

从这个问题上,我们获得启发:

  1. 分析程序的性能不能简单通过源程序判断,需要深入底层看看汇编码甚至于和OS硬件有关的指令执行状况
  2. 数学之美无处不在,一种根本无法想像的东西通过数学上代数环的性质迎刃而解
  3. 对于程序的分析如果发现逻辑不清,应当借助表格等工具静心一步一步的分析
  4. 配置Gedit让汇编码高亮 http://qianjigui.iteye.com/blog/248085

二、浮点运算的不精确性

   需要非常小心地使用浮点运算,因为浮点运算的范围和精度有限,而且浮点运算不遵守普通的算术性质,比如结合性。

 

未完待续

 

 

分享到:
评论

相关推荐

    深入理解计算机系统第二章作业

    综上所述,深入理解计算机系统的第二章涵盖了计算机体系结构的基础,如数据表示、指令系统、运算器设计、寻址技术和流水线处理。这些知识点是理解和设计计算机系统的关键,对于学习C/C++等编程语言也有着重要的指导...

    《深入理解计算机系统》课后习题答案

    ### 《深入理解计算机系统》课后习题答案解析 #### 知识点一:《深入理解计算机系统》课程及教材概述 - **教材名称**:“Computer Systems: A Programmer’s Perspective”(计算机系统:程序员视角) - **作者**:...

    深入理解计算机操作系统第三章习题答案

    《深入理解计算机系统》一书有两个版本,分别由Randal E.Bryant /和David R.O’Hallaron编著。书中主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态...

    《深入理解计算机系统》家庭作业的答案

    《深入理解计算机系统》是一本将程序设计者视角下计算机系统的各个方面介绍得十分详尽的经典教材。读者通过阅读这本书,可以对计算机硬件、操作系统、编译器等多个层次有一个全面而深刻的认识。在学习过程中,课后题...

    深入理解计算机系统第三版答案

    ### 深入理解计算机系统第三版答案 #### 一、概述 《深入理解计算机系统》(Computer Systems: A Programmer's Perspective)是一本广泛应用于计算机科学领域的教科书,由Randal E. Bryant与David R. O'Hallaron...

    深入理解计算机系统答案+超高清电子版+.docx

    《深入理解计算机系统》这本书是计算机科学领域的一本经典之作,它主要涵盖了计算机系统的各个方面,包括硬件、操作系统、编译器、程序设计等主题。书中的"答案+超高清电子版"部分通常提供了作者对书中练习题的解答...

    (完整版)深入理解计算机系统(第二版)家庭作业答案.doc

    根据提供的文档信息,我们可以深入探讨《深入理解计算机系统(第二版)》中涉及的一些关键知识点。这份文档似乎包含了第二章的一些家庭作业解答,涉及到计算机系统的底层操作,特别是二进制和位操作方面的问题。下面...

    深入理解计算机系统习题答案(最全最详细版)

    ### 深入理解计算机系统 #### 1. 教材介绍 - **书名**:《Computer Systems: A Programmer’s Perspective》 - **作者**:Randal E. Bryant 和 David R. O’Hallaron - **出版日期**:2003年12月4日 - **版权说明**...

    深入理解计算机系统_第三版英,第二版中英

    《深入理解计算机系统》是计算机科学领域的一本经典著作,旨在帮助读者全面了解计算机系统的运作原理。这本书的第三版英文版以及第二版的中英文双语版提供了丰富的学习资源,对于想深入研究操作系统、计算机架构、...

    《CSAPP深入理解计算机系统(第二版)》课后答案

    ### 《CSAPP深入理解计算机系统(第二版)》课后答案解析 ...以上是《CSAPP深入理解计算机系统(第二版)》第二章部分习题的详细解答。通过对这些习题的学习,有助于深入理解计算机系统的数据表示与基本运算机制。

    深入理解计算机系统 第二版 part2

    以上内容仅涵盖了《深入理解计算机系统》第二版中第四章至第七章的部分核心知识点。这些章节不仅对计算机科学领域的基础知识进行了深入浅出的讲解,还提供了大量实例和练习题帮助读者巩固所学内容。希望通过对这些...

    深入理解计算机系统英文版深入理解计算机系统英文版

    根据提供的文件信息,我们可以深入探讨《深入理解计算机系统》这一教材中的关键知识点。该书由Randal E. Bryant和David R. O’Hallaron撰写,旨在帮助程序员更好地理解计算机系统的内部工作原理。以下是对该书部分...

    深入理解计算机系统答案.docx

    《深入理解计算机系统》这本书是计算机科学的经典之作,它涵盖了计算机系统的多个重要方面,包括硬件、软件、编程语言和系统设计。以下是对书中的部分知识点的详细解释: 1. **数值计算**: - **截断与模运算**:...

    深入理解计算机系统(CSAPP) 英文原版(完整版!!!)

    《深入理解计算机系统》(英文原版,Complete Edition)是一本深受全球IT专业人士推崇的经典教材,由Randal E. Bryant和David R. O'Hallaron合著。这本书以深入浅出的方式介绍了计算机系统的各个方面,包括硬件、...

    深入理解计算机系统(英文版)

    ### 深入理解计算机系统(英文版) #### 书籍简介 《深入理解计算机系统》是一本经典的计算机科学教材,由 Randal E. Bryant 和 David R. O’Hallaron 编写。本书旨在帮助程序员通过深入了解计算机系统的内部运作来...

    csapp 深入理解计算机系统 课后答案

    ### csapp 深入理解计算机系统 课后答案 #### 经典的课本的答案(csapp 中文译名:深入理解计算机系统) ##### 标题解析与知识点概述 本标题指向了《深入理解计算机系统》一书的课后答案。这本书是计算机科学领域...

Global site tag (gtag.js) - Google Analytics