网页功能: 加入收藏 设为首页 网站搜索  
一个内嵌汇编的代码示例
发表日期:2006-08-28作者:[转贴] 出处:  

应朋友要求,在这里给出一段内嵌汇编代码的示例。

  在Windows9x/NT里,你的应用程序加载到内存后,被操作系统放在一个虚拟的受保护的地址段中(这又涉及到保护模式下的编程了,这一讲起来可就不是一天两天的事了)。在你的正式的程序代码开始运行之前,操作系统已经把所有的段寄存器(CS、DS、ES、SS、GS、FS)都初始化好了,它把你所有的数据(包括代码和你在程序中新分配的数据)都放在一个段里(因为CS=DS=ES=SS),这个段最大可以有4GBYTE(该够你折腾的了吧)。也就是说,这里只有一个数据段,不象原来在实模式下(就是DOS下)还要再关注段的越界问题,你只要往指针(Win9x/NT里都是32位的指针)指向的地址里写数据就可以了,不要管现在在哪个段里。甚至用DirectX获得的那些Surface地址、显存地址(Lock Surface之后得到的)等等都是被映射到你现在这个段里的,得到的指针不过是实际物理地址映射到这个数据段里的偏移址。因此,在Win9x/NT下写一般应用的内嵌汇编(你写系统内核的东西比如驱动程序之类的是个例外,可以当我上面说的是在放屁),就不要改动它的段寄存器,不要说我没提醒你,否则肯定是非法操作,要不就死得很难看。

  知道了这一点,写起来应该没什么麻烦了吧!其它的和在DOS下写汇编就没什么太大区别了。只要注意一下,这里的地址都是32位的,就是用地址的时候都是要加“E”的(EDI、ESI、EBX之类的)就可以了。其他关于32位的汇编语言还要我再讲么?大学的图书管里肯定会有这种书,而且借的人肯定不会多,毕竟我们这类喜欢编游戏又不自量力地来用汇编优化代码的另类不是太多。
另外再说一点,汇编虽然效率最高(用汇编优化程序,还要注意流水线——Pentinum之后的CPU——的优化问题,优化好的代码要比不优化的代码效率提高20-30%呢,详情请见《云风工作室》,那个东西就比较复杂了),但是也不要滥用,只有当确实需要的时候再写。毕竟现在室21世纪了,高级语言都发展这么久了,干吗还要回到茹毛饮血的时代呢?

还是从检测CPU开始吧。

void main()
{
  if(!CheckMMXSupport())
    return;

  int a = 1, b = 2;
  Swap(&a, &b);
  printf("a = %d, b = %d", a, b);
}

#define cpuid  __asm _emit 0x0F _emit 0xA2
__declspec(naked) BOOL CheckMMXSupport()
// 加不加前面这个东西有什么区别,大家用单步调试时看一下反汇编窗口就知道了

// 因为C语言里通用寄存器(EAX、ESI之流)是可以废弃的,故可以用naked

{
  __asm{
    mov eax, 1;
    cpuid;
    xor eax, eax;  // 将EAX清零

    test edx, 0x800000;
    jz _NO_SUPPORT_MMX;
    mov eax, 1;   // 32位的返回值放在EAX中,这是C语言的规定

_NO_SUPPORT_MMX:
    ret;
  }
}

void Swap(int* a, int* b)
{
  __asm{
    mov edi, a;
    mov esi, b
    mov eax, [edi];
    xchg eax, [esi];
    mov [edi], eax;
  }
}

 

具体的东西还要靠大家自己学习,多看看试试就会了,我只能是领个路。

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 一个内嵌汇编的代码示例
本类热点文章
  SSE 介紹
  浮点数到整数的快速转换
  基于SSE指令集的程序设计简介
  CPU 的 cache 和 latency
  关键字 对齐 内存对齐
  INTEL 体系结构 MMX™ 技术开发者..
  在非MFC程序中使用调试宏 ASSERT(),VER..
  Microsoft Visual C++ 浮点优化
  INTEL X86 体系 32 位汇编语言速成
  加速&优化技术
  加快程序运行速度的技巧
  VC代码的编写和调试
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00371