2006年9月17日CMD的故事和内存的栈写入的顺序

  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.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

aa.cpp
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:aa.exe
aa.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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值