随笔-341  评论-2670  文章-0  trackbacks-0
 
     摘要: 为了让编译成x86后的代码可以转换成C++的函数指针,我们也必须处理成员对齐的事情。如果脚本里的结构成员对齐跟C++不一致的话,会造成很多麻烦。下面是成员对齐的计算方法:  阅读全文
posted @ 2009-03-09 20:46 陈梓瀚(vczh) 阅读(3736) | 评论 (2)编辑 收藏
     摘要: x87的FPU支持很多种浮点运算,其中浮点运算的比较结果不放在EFLAGS里,我们需要人手取出。在比较a和b的时候,C2=0,C3=(a==b),C0=(a<b)。我们可以将FNSTSW AX指令将浮点标志位复制到AX,然后通过读取C3、C2和C0(分别位于第14、10、8位)来判断结果。下面是一个求浮点数组最大值的汇编函数:  阅读全文
posted @ 2009-03-06 04:56 陈梓瀚(vczh) 阅读(1488) | 评论 (0)编辑 收藏
     摘要: 本来昨天搞定了异常处理之后决定狂喜一天,谁知道今天用release编译了一下之后竟然挂了!资料找了半天发现是Windows XP之后提供的一项保护SAFESEH搞的鬼。于是需要将自己的异常处理函数添加进PE头的SAFESEH列表中。方法如下:  阅读全文
posted @ 2009-03-04 08:40 陈梓瀚(vczh) 阅读(1882) | 评论 (2)编辑 收藏
     摘要: 使用上一篇文章的资料,就可以使用汇编实现异常处理了。下面来看一个例子。  阅读全文
posted @ 2009-03-03 00:20 陈梓瀚(vczh) 阅读(2268) | 评论 (1)编辑 收藏
A Crash Course on theDepths of Win32 Structured Exception Handling, MSJ January 1997
http://www.microsoft.com/msj/0197/Exception/Exception.aspx

对于结构化异常处理(SEH)的进一步探索(读后感)
http://vicchina.51.net/research/other/seh/sehadvance.htm

NT 中的异常帧结构和异常嵌套(读后感续)
http://vicchina.51.net/show_article.php?id=65
posted @ 2009-03-02 04:45 陈梓瀚(vczh) 阅读(1755) | 评论 (0)编辑 收藏
     摘要: stdcall、cdecl和fastcall的参数都是从右到左入栈,并且返回值遵循以下规律:
小于等于4字节结构用EAX
小于等于8字节结构用EDX:EAX
浮点数用ST(0)
其他则在EAX放置一个指针,供返回值使用

stdcall被调用者清栈,cdecl调用者清栈,fastcall被调用者清栈并且前两个小于等于4字节的参数放入ECX和EDX。返回值和参数如果一方有构造函数或析构函数则不使用寄存器。
于是今天用字符串形式的汇编写了三种调用方法的求和函数:  阅读全文
posted @ 2009-03-01 05:27 陈梓瀚(vczh) 阅读(1792) | 评论 (9)编辑 收藏
     摘要: 这个汇编程序读入一个字符串,并计算结果。支持加减乘除括号,不支持浮点数,不支持查错。以下是汇编以及注释。汇编程序使用这篇文章的程序编译并执行。  阅读全文
posted @ 2009-02-26 09:05 陈梓瀚(vczh) 阅读(2203) | 评论 (0)编辑 收藏
     摘要: 今天完成了文本格式汇编代码的编译工作。这主要是为了调试,因为编译器不可能产生文本格式的汇编代码,这样会很浪费资源。翻译过程如下:  阅读全文
posted @ 2009-02-26 01:27 陈梓瀚(vczh) 阅读(3346) | 评论 (2)编辑 收藏
     摘要: 光能编译汇编还是不行的,因为很多东西在编译的时候不知道,典型的比如放常量那部分的指针等等。主要原因还是因为x87(指FPU部分)没有指令包含浮点立即数,所有装载浮点常数的指令都要求提供指针。所以诸如double a=1.2;之类的代码,需要将1.2预先放置在一个地方然后确定指针的位置。

于是就遇到了一个问题,如何将编译后才知道的指针地址写进去呢?  阅读全文
posted @ 2009-02-22 22:41 陈梓瀚(vczh) 阅读(1919) | 评论 (1)编辑 收藏
     摘要: 在完成了这里和这里的工作之后,就可以写程序生成机器码了。在生成机器码的时候有如下注意事项:

1:可执行代码所在的空间必须使用VirtualAlloc与PAGE_EXECUTE_READWRITE标记分配。
2:程序需要的常量空间、全局变量空间和指令空间需要分开在三个不同的地方。

下面的例子使用一个struct保存指令的每一个部分,并且结合之前产生的指令译码表生成二进制码。  阅读全文
posted @ 2009-02-22 07:08 陈梓瀚(vczh) 阅读(4931) | 评论 (11)编辑 收藏
仅列出标题
共35页: First 18 19 20 21 22 23 24 25 26 Last