一个稍微复杂的例子·计算两个1bit的二进制数的和(增加exit和goto操作)add(x,y)1. zero z0x问题:2. zero z1如果只用zero、flip、test3. equality test(x,y)exit、goto操作,能完成4.test eq goto 7这个任务吗?5. flip z06. exitz1 z07. zero t8. flip t口9.equality test(x,t)10.testeqflipz1
一个稍微复杂的例子 • 计算两个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-yl的c代码//---汇编代码int absdiff(int x, int y)movl 8(%ebp),%edx;取x的值movl 12(%ebp),%eax;取y的值(cmpl%eax,%edx;比较x和y的值if (x<y)jl.L3;如果y<x转到.L3subl %eax,%edx;计算y-xreturn y -x;movl%edx,%eax;返回值elsejmp .L5;跳转到.L5.L3:;y<xreturn x -y;subl %edx,%eax ;计算x-y1J.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 importancewhen compared tothebits and theirinternal arrangement.Itis the bits that"sense"the external stimuliarriving from theoutside world via buttons,levers,keys on a keyboard,electroniccommunication lines,and even microphones and cameras.It is the bitsthat"decide”howto reacttothese stimuli and respond accordinglybydirecting other stimuli tothe outsideviadisplays,screens,printers,loudspeakers,beepers,levers,and cranks
但,本质上都是: