本来就已经搞定了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行~继续改。
阅读(949) | 评论(0) | 转发(0) |