win32asm原理

中文翻译:肖德时

这篇指南是想让读者能懂得怎样使用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 之间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: c32asm是一个非常流行的汇编语言教学工具,它可以帮助用户更好地学习和理解汇编语言。而CSDN则是一个非常知名的技术社区网站,提供了各种技术相关的博客、论坛、问答等资源。 要下载CSDN,首先需要打开CSDN的官方网站,并注册一个账号。注册账号后,登录到自己的CSDN账号,就可以开始浏览和下载CSDN上的各种资源了。 CSDN上的资源很丰富,你可以通过搜索框输入你感兴趣的关键词来查找对应的教程、代码示例等。如果你想下载CSDN上的某个博客或论坛贴子,可以直接点击对应的标题进入详情页面,然后查找下载链接进行下载。 另外,CSDN还提供了一些付费的高级会员服务,比如VIP会员等级,购买这些会员服务后可以享受更多的特权和资源。如果你对CSDN的资源很感兴趣,可以考虑购买相应的会员服务来获取更多的资源和更好的使用体验。 总之,要下载CSDN上的资源,你只需要注册一个CSDN账号,并登录后浏览和搜索对应的资源,然后根据页面上的下载链接进行下载即可。希望这个回答对你有帮助! ### 回答2: c32asm 是一个用于开发和编写汇编语言的工具,而 CSDN 是一个面向程序员的技术社区网站。要下载 CSDN,你可以按照以下步骤进行操作: 1. 首先,打开你的浏览器,然后在地址栏中输入 "www.csdn.net",并按下回车键,访问 CSDN 的官方网站。 2. 一旦进入 CSDN 的主页,你可以通过导航栏中的搜索框,输入你想要查找的内容或者关键词,比如 "c32asm",然后点击搜索按钮。 3. 在搜索结果页面中,你可能会看到与 "c32asm" 相关的文章、教程、项目等资源。你可以根据自己的需要,选择其中一个进行点击,以获取更详细的信息。 4. 点击所选择的资源后,你可能会进入到该文章或项目的详细页面。在页面上,你可以找到有关该资源的描述、下载链接或者其他相关信息。 5. 如果你找到了一个合适的资源并想要下载,一般情况下,下载链接会以按钮的形式呈现在页面上。你只需点击该按钮即可进行下载。 总之,如果你想要下载 CSDN,只需通过浏览器访问 CSDN 的官方网站,并通过搜索或浏览相关资源,找到对应的链接进行下载即可。 ### 回答3: 要在C32ASM中下载CSDN,可以按照以下步骤进行操作: 1. 打开任一浏览器,访问CSDN官网(https://www.csdn.net/)。 2. 在网站首页或者顶部导航中寻找下载链接,通常可以在网站底部的“下载APP”或者“客户端下载”等位置找到。 3. 点击下载链接,等待页面加载完成。 4. 在下载页面中选择适合C32ASM的版本,一般会提供多种操作系统的下载选项,例如Windows、macOS等。 5. 点击选择的操作系统版本进行下载,等待下载完成。 6. 下载完成后,可以在下载文件的默认目录(通常是浏览器的下载文件夹)中找到下载的安装包。 7. 通过文件管理器或者命令行工具,定位到安装包的路径。 8. 双击打开安装包,按照安装向导的提示完成安装过程。 9. 安装完成后,可以在C32ASM的菜单中找到并打开CSDN应用。 通过以上步骤,就可以在C32ASM中成功下载和安装CSDN应用,方便浏览和使用CSDN提供的开发资源和技术文章。 需要注意的是,如若C32ASM不支持直接下载CSDN应用,也可以通过浏览器访问CSDN网站,以获取并使用相关资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值