[利用asm代码学习c++语法]--enum

明天接着贴,有些似乎可以实际做事的时候再看,因为大同小异: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值