Xiao_bird博客

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::


[win32汇编框架 masm ]
.386
.model flat,stdcall
option   casemap:none
includelib D:\RadASM\masm32\lib\msvcrt.lib

printf proto c :ptr dword,:vararg
public start

.data
strs db 'Hello.asdfasdfasdf',0h

.code
start:

mov eax,offset strs
push eax
call printf
pop eax
ret

end start


.386 说明使用386指令系统,也可以为.486 .586等
.model flat,stdcall flat说明为平坦内存模式,stdcall表明函数调用采用stdcall约定,即Pascal约定,不同于C的cdecl约定
option casemap:none 表明不要将代码中的字符更换大小写,不进行此说明 的话,masm会将代码全部转换为大写字符
includelib 写明所要包含的库文件
printf proto c :ptr dword,:vararg 进行函数声明 proto c 说明为c调用约定,即cdecl约定 :ptr dword,:vararg为参数列表,后面的:vararg声明为可变参数,只有c调用约定才可以使用可变参数

public start 声明一个公共函数入口 start

.data 说明此处为初始化数据段

.code 说明此处为代码段
start: 函数入口的地方
...
end start 好像在Win汇编中,用end标识的函数名为程序执行入口函数。不过,这和使用的编译器有关。

注:被声明为c调用的函数,需要调用者处理堆栈,如果是stdcall约定,则要函数处理堆栈,即在函数结束的时候执行指令 ret [words] ,即需要堆栈指针前进几个字长

[Unix汇编框架 nasm ]
nasm只能生成目标文件,所以,将目标文件链接的操作可以交给gcc来完成,因此,程序入口需要使用main函数。

global main
extern printf

section .data
msg db 'Hello,world!',0Dh,0Ah,0

section .text
main:
      push msg
      call printf
      pop eax
      ret

global main 声明公共函数main
extern printf 声明外函数printf 注:Linux/Unix下采用动态编译不用显示包含printf所在的库文件,运行时系统会自动装入

section .data 此处为初始化数据段
section .text 此处为代码段
main:      函数开始的地方

汇编刚刚入门,以上内容备忘,有不对的地方请不吝指正!

posted on 2008-03-10 13:26  Xiao_bird  阅读(544)  评论(0编辑  收藏  举报