NASM与link、golink和alink具体例子使用对比

本文详细介绍了在Windows平台上使用NASM汇编器配合不同的连接器(alink、golink和微软的link.exe)进行程序链接的过程,特别是针对OMF、COFF文件格式的处理。通过具体的例子,展示了如何在32位和16位程序中导入外部函数,以及如何设置链接参数,如子系统类型、入口点和库依赖。此外,还探讨了不同连接器对于段合并和程序大小的影响。
摘要由CSDN通过智能技术生成

一、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文件格式链接:这种

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值