WEB开发网
开发学院软件开发汇编语言 简明x86汇编语言教程(4) 阅读

简明x86汇编语言教程(4)

 2010-01-10 09:37:41 来源:WEB开发网   
核心提示:3.2 保护模式实模式的东西说得太多了,尽管我已经删掉了许多东西,简明x86汇编语言教程(4)(3),并把一些原则性的问题拿到了这一节讨论,这样做不是没有理由的——保护模式才是现在的程序(除了操作系统的底层启动代码)最常用的CPU模式,直接返回计算结果就可以了,计算是多余的(如果说一定要算,保护

3.2 保护模式

实模式的东西说得太多了,尽管我已经删掉了许多东西,并把一些原则性的问题拿到了这一节讨论。这样做不是没有理由的——保护模式才是现在的程序(除了操作系统的底层启动代码)最常用的CPU模式。保护模式提供了很多令人耳目一新的功能,包括内存保护(这是保护模式这个名字的来源)、进程支持、更大的内存支持,等等。

对于一个编程人员来说,能“偷懒”是一件令人愉快的事情。这里“偷懒”是说把“应该”由系统做的事情做的事情全都交给系统。为什么呢?这出自一个基本思想——人总有犯错误的时候,然而规则不会,正确地了解规则之后,你可以期待它像你所了解的那样执行。对于C程序来说,你自己用C语言写的实现相同功能的函数通常没有系统提供的函数性能好(除非你用了比函数库好很多的算法),因为系统的函数往往使用了更好的优化,甚至可能不是用C语言直接编写的。

当然,“偷懒”的意思是说,把那些应该让机器做的事情交给计算机来做,因为它做得更好。我们应该把精力集中到设计算法,而不是编写源代码本身上,因为编译器几乎只能做等价优化,而实现相同功能,但使用更好算法的程序实现,则几乎只能由人自己完成。

举个例子,这样一个函数:

int fun(){
 int a=0;
 register int i;
 for(i=0; i<1000; i++) a+=i;
 return a;
}

在某种编译模式[DEBUG]下被编译为

push ebp
mov ebp,esp
sub esp,48h
push ebx
push esi
push edi
lea edi,[ebp-48h]
mov ecx,12h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi]
mov dword ptr [ebp-4],0
mov dword ptr [ebp-8],0
jmp fun+31h
mov eax,dword ptr [ebp-8]
add eax,1
mov dword ptr [ebp-8],eax
cmp dword ptr [ebp-8],3E8h
jge fun+45h
mov ecx,dword ptr [ebp-4]
add ecx,dword ptr [ebp-8]
mov dword ptr [ebp-4],ecx
jmp fun+28h
mov eax,dword ptr [ebp-4]
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
; 子程序入口

; 保护现场
; 初始化变量-调试版本特有。
; 本质是在堆中挖一块地儿,存CCCCCCCC。
; 用串操作进行,这将发挥Intel处理器优势
; ‘a=0’
; ‘i=0’

; 走着
; i++
; i<1000?
; a+=i;
; return a;

; 恢复现场

; 返回

而在另一种模式[RELEASE/MINSIZE]下却被编译为

xor eax,eax
xor ecx,ecx
add eax,ecx
inc ecx
cmp ecx,3E8h
jl fun+4
ret

; a=0;
; i=0;
; a+=i;
; i++;
; i<1000?
; 是->继续继续
; return a

如果让我来写,多半会写成

mov eax, 079f2ch
ret

; return 499500

为什么这样写呢?我们看到,i是一个外界不能影响、也无法获知的内部状态量。作为这段程序来说,对它的计算对于结果并没有直接的影响——它的存在不过是方便算法描述而已。并且我们看到的,这段程序实际上无论执行多少次,其结果都不会发生变化,因此,直接返回计算结果就可以了,计算是多余的(如果说一定要算,那么应该是编译器在编译过程中完成它)。

上一页  1 2 3 4 5  下一页

Tags:简明 汇编语言 教程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接