分享
 
 
 

Win32ASM原理

王朝system·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

中文翻译:肖德时

这篇指南是想让读者能懂得怎样使用MASM。如果你不熟悉MASM,请

下载一个win32asm.exe并通过本指南学习下去。好的,现在准备好

让我们一起前进吧!

原理概述:

从80286开始就有了保护模式下的win32程序,但是这已经成为历史。

所以我们这里所涉及到的都是与我们相关的80386及以后的版本。

windows在单独的虚拟磁盘空间运行单个win32程序。这个意思就是

说每个win32程序都有自己独立的4GB寻址空间。但这并不意味着每

个win32程序都有4GB的物理存储空间,只仅仅是这个程序能在这个

范围里寻址而已。工作是由windows来处理并确认这个程序内存地址

的有效性。当然,这个程序必须是按照windows程序规则来编译的

才行。和win16程序不一样的是所有的win16程序互相“看到”对方。

这在win32下是没有的。这个特征帮助减少某程序代码覆盖另一程序

的可能。内存模式也和以往的win16世界完全的不同。在win32世界里,

我们不需要考虑内存模式或者是什么段。这里只有一种模式:Flat memory model.

这里也没有什么64K段地址的限制。内存是一个4GB的连续的大空间。

也就是说我们不必非要和段寄存器玩。我们也能用一些段寄存器来

寻址内存中的某处。这对程序员来说是一个极大的帮助。这也让

编译win32程序和c语言一样。

当你在win32下编译程序时,你必须要知道一些重要的规则。其中一个是:

windows内部使用esi、edi,ebp和ebx并不能在这寄存器中改变数值。所以

记住这条规则的意思就是:假如你在返回函数中使用这四个寄存器中某个

的话,不要忘记在返回window时恢复初值。一个返回函数就是在你的程序中

返回window。一个返还函数就是被windows调用的你自己的私有函数,最典型

的例子就是windows程序。但这并不意味着你不能使用这四个寄存器了,只要

你能确认在返回windows时恢复了它们的初值就行了。

代码内容:

下面就是win32汇编程序代码的主框架,如果你看不懂这些代码的话,也不要

着急,我将在后面给予详细的解释。

.386

.MODEL FLAT,STDCALL

.DATA

<你的初使化数据>

.........

.DATA?

<你的未确定初使化数据>

.........

.CONST

<你的常量>

.......

.CODE

<标记>

<你的代码>

......

end<标记>

就是这些,让我们分析一下这个主框架吧!

.386

这是一个汇编程序指令,告诉汇编编译程序使用80386指令集,你也可以用.486,.586。

但可靠的指令集还是用.386。这里还有两个实际上差不多的指令集:.386/.386p,.486/.486p;

那个有“p”的指令集只是在用到有特权指令时才用到。特权指令集是只在保护模式

下被这个cpu/操作系统所接受的。它们也只能被特权代码所使用,例如设备驱动程序。

多数情况下,你的程序是工作在非特权模式下所以安全的作法是使用不带“p"的指令。

.MODEL FLAT,STDCALL

.MODEL是标记内存模式的指令,在win32下,也仅仅只有这个模式:FLAT。

STDCALL是告诉编译器参数的传递模式。在这个模式中有:左到右或右到左。

并要在完成子程序后平衡堆栈。在win16下,有两种传递模式:c和pascal。C子程序传递

是右到左,最右边的参数将首先被压入,并在传递结束时要求平衡堆栈。例如:一个名为

foo的程序被调用,(int first_param,int second_param,int third_param)在C程序传递

中的汇编代码如下

push [third_param] ;压入第三个参数

push [second_param] ;压入第二个参数

push [first_param] ;压入第一个参数

call foo

add sp,12 ;平衡堆栈

PASCAL正好与C传递模式相反,它是通过左到右传递参数并在完成子程序后平衡堆栈的。

win16采取PASCAL传递方式是因为它的运行代码量小。C传递模式是在你不知道要传递

多少参数比如像wsprintf()子程序。在wsprintf()子程序中,子程序不能预先知道有

多少参数被压栈,所以你也不知道要怎样使堆栈平衡。

STDCALL是C和PASCAL传递模式的综合,它是通过右到左传递模式传递参数并平衡堆栈的,并

只有在win32下才专用的传递模式。但也有例外的是wsprintf(),你必须使用C传递模式。

.DATA

.DATA?

.CONST

.CODE

这四个指令是干什么用的呢?在win32下是没有段的,你记起来了吗?但是你仍然能按照

逻辑分区划分你的地址空间。这个最先的分区表是上一分区的结束。这里我们分为两个分区,

data和code。data分区又被分为三类:

.DATA 这个分区包含你的程序的初始化代码

.DATA?这个分区包含你程序的未初始化数据,有时你想预先分配一些内存但不想初始化它,

这个分区就是为这个想法而设的。这个未初始化数据的优势是:它不会增加程序容量大小。

比如,你在.DATA?分配了10,000字节容量,但你的程序并不是增加了10,1000字节。它仍然

和原大小一样。你只是仅仅告诉编译器当程序载入内存时你需要多少空间。就是这些。

.CONST这个分区包含你的程序的常量定义说明。在这个分区定义的常量就不能被修改,因为

它们已经被定义。

你也并不是非要在你的程序中都要使用这三个指令,只要说明你需要的指令就行了。

剩下来的分区是代码区:.CODE。以下是它的主构架:

end

这里的任意的只是说明你的代码区域,还有就是这两个label要一样哟!你的所有代码

都在和 end 之间。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有