2006年9月17日 星期日 天气晴 Last Modify: Feb 6, 2007================================================================================== 今天的虽然没怎么开电脑,但是深夜的访谈似乎收获不少,老刘的TeOS已经完成了一个简单的shell并
可以执行两个命令了。 首先来说说CMD的故事,一般来说我们启动的都是CMD.exe是个32位程序,但是在system32中有
cmd.com,这个是个16位的程序,对中文和长文件名的支持都不好。当有程序需要进入16位实模式时可以自动切
换。(这是看到VC的类库中的默认的未定义unicode时采用不支持中文的方法时顺便讨论的) 在MASM中的ML是早期的编译器,在5.0之后出现了masm这个程序,通过这个程序也可以编译程序。
似乎ML的参数更多一些。我使用的是1993年的MASM6.11,虽然很古老,但是作为简单的教学还是足够的。虽然
C的库没有公开代码,但是通过C的编译器选项/Fa可以实现将C文件输出为ASM文件,从而窥探C的类库的奥秘。
我们围绕C的标准栈处理方式,经典处理方式和Pascal处理方式进行了试探。一个是在函数完成之前就弹出,一
个是函数调用完成之后再弹出……比较复杂…… 另外的一个问题就是内存的栈写入的顺序,一般来说是从高向低写入的,也就是我们要写一个值(如
WORD)到内存中去的时候就把BasePoint(BS指针)减2,再写一个就再减2,当我们这个函数调用完成的时候
就把BS指针加4,这个动作完成了内存的释放。 最后说一下无意义的定义,但是可以提高程序的可读性,如: #define IN #define OUT #define WINDOWS_API 最后附cl输出ASM,假设在E盘的aa文件夹下有aa.cpp。 E:/aa>cl /Fa aa.cppMicrosoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
aa.cppMicrosoft (R) Incremental Linker Version 6.00.8168Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:aa.exeaa.obj
-----Feb 2, 2007 Added------------------说实话,那个堆栈处理方式当时挺晕的,后来看Intel汇编程序设计那本书的call的增强指令invoke把参数压栈按
stdcall之类的顺序的时候才真正的明白;看了C的返汇编和调试才明白原来局部变量是在堆栈里,原来机器的堆
栈不像数据结构那样简单,还可以按地址访问,这才算是明白了缓冲区溢出的根源。看来学习汇编确实对底层有
不少的帮助,而且成功的申请了intel那一箱子书确实让老刘的保护模式有了深刻的了解(特别是看linux系统代码
的时候),而我的书不知道什么时候才能看完……也许我应该把我的电脑也卖掉……虽然他把卖电脑的钱交了学费
属于意外,但是上了半个学期的自习也是好事……
Rev 1.0 Creat Document sep 17 2006 Rev 1.1 Add Content Feb 2, 2007 Rev 1.2 Fix a Spelling Mistake Feb 6, 2007