明天接着贴,有些似乎可以实际做事的时候再看,因为大同小异:asm下除了地址、整型值、浮点值、栈、寄存器、标志位、指令集等等概念,似乎没有什么(实际写起来还是麻烦,俺也只是看得懂一点,为了学c/c++/win32api等才看看)。
c++语法仅仅是对机器指令进行了高层的封装,从而方便用户表达某些思想,但同时给用户造成了一些误解,使得我们容易在使用c++时忽略了各种不同语句背后的不同成本开销。
实际asm中有些还与页、页内短跳转、页间跳转、cache命中率、中断等概念相关。
学c++语法(学c、mfc、win32api、net等等),个人觉得应该同时兼顾两个层次:向下能看到汇编语言级(甚至机器码)的程序在硬件中的运行过程;向上应该看到计算机知识细节背后的数学思想、哲学思想。
对于c++参考书,还是c++之父写得书最为有韵味。
在vs2005下建立vc++的win32 控制台应用程序,设置stdafx.h不必要包含,设置多字符集,设置汇编输出/FAs。代码和asm解析如下:
#include <stdio.h>
enum Y
{
Y1,Y2=2,Y3
};
struct X
{
int i,j,k;
X(int t1, int t2, int t3):i(t1),j(t2),k(t3){}
};
int main(int argc, char* argv[])
{
X t(Y1, Y2, Y3);
printf("t.i(%d) j(%d) k(%d)/n", t.i, t.j, t.k);
getchar();
return 0;
}
; 13 : X t(Y1, Y2, Y3);
push 3;enum只是常量,编译期确定值
push 2
push 0
lea ecx, DWORD PTR _t$[ebp]
call ??0X@@QAE@HHH@Z ; X::X
; 14 : printf("t.i(%d) j(%d) k(%d)/n", t.i, t.j, t.k);
mov esi, esp
mov eax, DWORD PTR _t$[ebp+8];访问t.k
push eax
mov ecx, DWORD PTR _t$[ebp+4]];访问t.j
push ecx
mov edx, DWORD PTR _t$[ebp]
push edx
push OFFSET ??_C@_0BF@LMJHAKCK@t?4i?$CI?$CFd?$CJ?5j?$CI?$CFd?$CJ?5k?$CI?$CFd?$CJ?6?$AA@
call DWORD PTR __imp__printf
add esp, 16 ; 00000010H
cmp esi, esp
call __RTC_CheckEsp