这本书刚刚买的,读了前几章。感觉思路很好,比如通过汇编代码来分析C++的特性。然而,细节的地方不够认真!!! 例如:p25-p31的一个汇编例子包含如下瑕疵。 1.书中所附汇编代码与实际用VC6.0生成的并不一致。假设是略去了与功能无关的内容,那么又处理得不彻底,程序无法正确理解,更不能正常运行。正确汇编代码附于下: TITLE mfc12.cpp .386P include listing.inc if @Version gt 510 .model FLAT else _TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS _DATA SEGMENT DWORD USE32 PUBLIC 'DATA' _DATA ENDS CONST SEGMENT DWORD USE32 PUBLIC 'CONST' CONST ENDS _BSS SEGMENT DWORD USE32 PUBLIC 'BSS' _BSS ENDS $$SYMBOLS SEGMENT BYTE USE32 'DEBSYM' $$SYMBOLS ENDS $$TYPES SEGMENT BYTE USE32 'DEBTYP' $$TYPES ENDS _TLS SEGMENT DWORD USE32 PUBLIC 'TLS' _TLS ENDS ; COMDAT ?add@@YAHHH@Z _TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS ; COMDAT _main _TEXT SEGMENT PARA USE32 PUBLIC 'CODE' _TEXT ENDS FLAT GROUP _DATA, CONST, _BSS ASSUME CS: FLAT, DS: FLAT, SS: FLAT endif PUBLIC ?add@@YAHHH@Z ; add ; COMDAT ?add@@YAHHH@Z _TEXT SEGMENT _i$ = 8 _j$ = 12 _z$ = -4 ?add@@YAHHH@Z PROC NEAR ; add, COMDAT
; 4 : {
push ebp mov ebp, esp sub esp, 68 ; 00000044H push ebx push esi push edi lea edi, DWORD PTR [ebp-68] mov ecx, 17 ; 00000011H mov eax, -858993460 ; ccccccccH rep stosd
; 5 : int z=i+j;
mov eax, DWORD PTR _i$[ebp] add eax, DWORD PTR _j$[ebp] mov DWORD PTR _z$[ebp], eax
; 6 : return z;
mov eax, DWORD PTR _z$[ebp]
; 7 : }
pop edi pop esi pop ebx mov esp, ebp pop ebp ret 0 ?add@@YAHHH@Z ENDP ; add _TEXT ENDS PUBLIC _main EXTRN __chkesp:NEAR ; COMDAT _main _TEXT SEGMENT _a$ = -4 _b$ = -8 _c$ = -12 _main PROC NEAR ; COMDAT
; 10 : {
push ebp mov ebp, esp sub esp, 76 ; 0000004cH push ebx push esi push edi lea edi, DWORD PTR [ebp-76] mov ecx, 19 ; 00000013H mov eax, -858993460 ; ccccccccH rep stosd
; 11 : int a=100;
mov DWORD PTR _a$[ebp], 100 ; 00000064H
; 12 : int b=30;
mov DWORD PTR _b$[ebp], 30 ; 0000001eH
; 13 : int c=add(a,b);
mov eax, DWORD PTR _b$[ebp] push eax mov ecx, DWORD PTR _a$[ebp] push ecx call ?add@@YAHHH@Z ; add add esp, 8 mov DWORD PTR _c$[ebp], eax
; 14 : return 0;
xor eax, eax
; 15 : }
pop edi pop esi pop ebx add esp, 76 ; 0000004cH cmp ebp, esp call __chkesp mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END 2.关于函数调用时堆栈的处理和平衡,表述不清,图示不明,难于理解。鉴于这是一个放在前面作为引导的重要例子,实在应该讲透了。这样,后边的以大堆例子才好给人家理解。 建议作者: 1.写书最好还是假于己手,包括代码实例。如果让学生或助手代劳,需仔细指导,严格把关,定稿前甄别出潜藏的错误。 2.关于汇编例子的错误,不止出现在这一个例子之中。建议按正确生成的代码重写,并在适当的媒介上,向读者公布。
|