一、OMF文件格式链接:使用import伪指令,import伪指令可以直接使用函数名,而不用给函数名加上'_'前缀和'@number'后缀,但import伪指令仅适合于OMF(borland obj)格式输出,OMF格式是MS在16位下操作系统的目标文件格式,borland仍然使用这种格式,并将格式进行了扩展,使得可以在Win32环境下使用,NASM支持这种扩展的OMF格式,但必须显式指定生成32位的obj。由于import伪指令需要OMF格式的支持,而MS的link.exe连接器会在连接时自动将OMF格式转换成COFF格式,从而无法完成导入外部标志的操作,因此,需要一个直接支持连接OMF格式的连接器,这里推荐开源连接器alink.exe。alink.exe连接器将根据import伪指令生成的连接信息,找到所需动态库,并自动导入外部函数符号。..start也是NASM针对OMF格式设计的程序入口简化标志,export伪指令生成的导出指令也将由alink.exe来执行。注意:alink.exe不支持段合并(至少我不知道如何使用alink.exe进行段合并>_<),因此,连接生成的EXE程序稍大一些,为2.51kb,有3个段,而上述另两种操作生成的EXE文件只有一个.text段。
1、32位程序例子:
;filename:obj32.asm
import MessageBoxA user32.dll
extern MessageBoxA
import ExitProcess kernel32.dll
extern ExitProcess
global obj32
export obj32
[SECTION CODE USE32 CLASS=CODE]
szTitle:
db "SayHello",0
szMsg:
db "Hello World!", 0
obj32:
push 0 ;uType
push dword szTitle ;lpCaption
push dword szMsg ;lpText
push 0 ;hWnd
call [MessageBoxA]
ret 16
..start:
call obj32
push 0
call [ExitProcess]
使用alink。
cmd> nasm -fobj obj32.asm
cmd> alink -oPE obj32.obj
2、16位程序例子:
;filename:obj16.asm
segment code use16
str1: db "name$"
segment data use16
..start:
mov ax,code
mov ds,ax
mov dx,str1
mov ah,9
int 21h
mov ah,4ch
int 21h
使用alink。
cmd> nasm -fobj obj16.asm
cmd> alink obj16.obj 或alink -oEXE obj16.obj
二、微软Win32平台的coff文件格式链接:这种