Chinaunix首页 | 论坛 | 博客
  • 博客访问: 337180
  • 博文数量: 105
  • 博客积分: 2730
  • 博客等级: 少校
  • 技术积分: 1110
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-20 12:09
文章分类

全部博文(105)

文章存档

2013年(3)

2012年(2)

2011年(36)

2010年(34)

2009年(6)

2008年(20)

2007年(4)

分类:

2008-02-24 01:12:16

本来就已经搞定了nasm格式的,非常优秀的从c0到汇编的编译器。结果不问不知道,一问吓一跳,晓华君说一定要用win到死下masm编译才行,所以只好加了个“跨平台”进去。

由此也学到了一些东西,同时也深感masm格式的恶心,关于中扩号的使用~没法记,只能写一个试一个。

java,唉,好使,真好使。

无论是各个平台上的c调用都是遵循相同的标准(废话,c调用自然是c调用的标准)。

从右向左压栈,调用方恢复堆栈,如果被调用方是系统或者是一些标准函数库,那么它会保证ebx,edi,esi的安全,所以在调用printf这类函数前,只要关系一下自己的eax,ecx,和edx是否需要保存就够了,其他的一切(一般意义上)都会在返回时恢复。

在masm(32位)汇编语言里调用lib库里的c函数这一过程该如何实现?今天经过一番搜索,总结出了原理,也发现网上面有很多文章和程序在给人带来很多误导。

废话再说一句,发代码的不写说明,简直就是害人。

需要的工具:ml.exe,link.exe 相应的lib文件,比如,我的程序需要调用printf和scanf函数,就需要msvcrt.lib文件,这3个文件可以直接拷贝到一个文件夹下,方便使用和目光清晰。

编写asm代码:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; t.asm
.386
.MODEL FLAT
includelib msvcrt.lib
printf proto C:dword,:vararg
scanf proto C:dword,:vararg
.STACK 4096

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
前两句就不解释了,第三行是包含库的说明,和c里 include "**" 意思一样,lib文件放在哪就写相应的目录名,可以是相对路径或绝对路径。
4、5行是函数的声明,缺了的话在编译时就会报错。格式没有研究过,但是根据字面意思,dword按其长度可以是指针或整数。vararg就是任意长度的参数。(其实这样的话把也能够看出把:dword删去也一样能编译通过。

然后在这个目录下开启命令行,

> ml /c /coff t.asm
> link t.obj
就可以生成t.exe文件了。


其实从对代码的理解来看,masm里的声明对于写真汇编是不需要的,只要proto C 就够了,win32 的宏汇编在我看来已经十分不能称为汇编了,除了寄存器的操作,分支和调用都是宏。

先到这吧,老不记录就都忘了,记多了又没时间做事了,还是等告一段落再做总结吧,忽悠悠6k行~继续改。
阅读(910) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~