一个稍微复杂的例子 ·计算两个1bit的二进制数的和(增加exit和goto操作) add(x,y) 1.zero zO X 问题: 2.zero z1 如果只用zero、flip、test 3.equality test(x,y) exit、goto操作,能完成 4.test eq goto 7 这个任务吗? 5.flip zO 6.exit 7.zero t z120 8.flip t 9.equality test(x,t) 10.test eq flip z1
一个稍微复杂的例子 • 计算两个1bit的二进制数的和(增加exit和goto操作) add(x,y) 1. zero z0 2. zero z1 3. equality test(x,y) 4. test eq goto 7 5. flip z0 6. exit 7. zero t 8. flip t 9.equality test(x,t) 10. test eq flip z1 问题: 如果只用zero、flip、test exit、goto操作,能完成 这个任务吗?
封装+抽象 ·用最原子的操作封装成更“高级”的操作 ·用三个基本操作可以实现“相等”操作 ·用“相等”操作可以实现一位的加法操作 ·用一位的加法“间接操作”可以实现普通加法 ·a:=x+y 实际上,现代计算机内部电路能提供的“原子”操作远不止这5个基 本操作 不同的原子操作=不同的计算机 实际上,我们在编写程序时使用“封装”的高级操作可以“随心所欲” 不同级别的语言、不同级别的软件库
封装+抽象 • 用最原子的操作封装成更“高级”的操作 • 用三个基本操作可以实现“相等”操作 • 用“相等”操作可以实现一位的加法操作 • 用一位的加法“间接操作”可以实现普通加法 • a:= x + y 实际上,现代计算机内部电路能提供的“原子”操作远不止这5个基 本操作 不同的原子操作 == 不同的计算机 实际上,我们在编写程序时使用“封装”的高级操作可以“随心所欲” 不同级别的语言、不同级别的软件库
一段等价的汇编和高级语言程序 /-计算|x-yI的c代码 ∥----汇编代码---- int absdiff(int x,int y) movl8(%ebp),%edx;取x的值 movl12(%ebp),%eax;取y的值 cmpl%eax,%edx;比较x和y的值 if (x y) j1.L3 ;如果y<x转到.L3 subl%eax,%edx;计算y-x return y -x; movl%edx,%eax;返回值 else jmp .L5 ;跳转到.L5 .L3: y<X return x-y; subl%edx,%eax;计算x-y } .L5: ;完成
一段等价的汇编和高级语言程序 //--计算|x-y|的C代码- int absdiff(int x, int y) { if (x < y) return y - x; else return x - y; } //----------汇编代码---------- movl 8(%ebp),%edx ; 取x的值 movl 12(%ebp),%eax ; 取y的值 cmpl %eax,%edx ;比较x和y的值 jl .L3 ;如果y<x 转到.L3 subl %eax,%edx ; 计算y-x movl %edx,%eax ; 返回值 jmp .L5 ; 跳转到.L5 .L3: ;y<x subl %edx,%eax ;计算x-y .L5: ; 完成
但,本质上都是: However,the outward appearance is of peripheral importance when compared to the bits and their internal arrangement.It is the bits that"sense"the external stimuli arriving from the outside world via buttons,levers,keys on a keyboard,electronic communication lines,and even microphones and cameras.It is the bits that"decide" how to react to these stimuli and respond accordingly by directing other stimuli to the outside via displays,screens,printers,loudspeakers,beepers,levers,and cranks
但,本质上都是: