[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: 函数开始的地方
汇编刚刚入门,以上内容备忘,有不对的地方请不吝指正!