汇编之两个文件的链接

伤不起啊伤不起,恶心了两天了,网上教程几乎也没有,真的是。。。
好了,首先看一下main.asm的代码:

include \masm32\include\masm32rt.inc
    .data?
      value dd ?
    .data
      item dd 0
    .code
start:
    call main
    inkey
    exit
main proc
    cls
    print "Hello World",13,10
    ret
main endp
end start

平淡无奇的代码,而且是教程代码,没道理出错,.386也没有也不知道它是默认谁的,编译了一下,能行,出来helloworld了
然后写一个sub.asm,然后link进去,代码同上
出现问题了:
sub.obj : error LNK2005: _start already defined in main.obj
sub.obj : error LNK2005: _main@0 already defined in main.obj
main.exe : fatal error LNK1169: one or more multiply defined symbols found
解决方法是:把sub.asm的start去掉,把main改成subproc,重新编译
好,现在仍然能够成功运行出helloworld
然后,给sub.asm里添加上一个public
好,同样可以,然后再在main.asm里添加上extrn
出现错误:
main.obj : error LNK2001: unresolved external symbol _vars
main.exe : fatal error LNK1120: 1 unresolved externals
看了一下,原来是自己变量名写错了。。。改成items
成功了
因为在cmd里,没办法进行mov ah, 2 然后int 21h,恐怕不行
然后再是函数,public一个函数出来
出现问题:
main.obj : error LNK2001: unresolved external symbol _subproc
main.exe : fatal error LNK1120: 1 unresolved externals
问题与上面如出一辙,但有一个问题是,这回名字并没有写错啊?
去掉items,不行
改动.code 为 .code code1
出现问题:
sub.asm(11) : fatal error A1010: unmatched block nesting : subproc
看来不行
把subproc改成near?
仍然不行,出错提示上同
在网上查了一下,发现有用proto,难道extrn不能用了吗?
竟然成功了。。。
但是如何打印在控制台上就有点不会了。。。
好,完全成功
然后是编译成lib的问题
好,首先一个超简单的命令:

D:\masm32\bin\lib sub.asm
sub.asm : fatal error LNK1136: invalid or corrupt file
我并不会使用lib,看看怎么用
网上说,dos下是无法使用lib的
解决方法:用lib sub.obj , 即改成obj文件就好了
D:> link main.obj sub.lib
出现错误:
LINK : fatal error LNK1221: 无法推导出子系统,必须定义它
解决方法:使用如下:
link /sussystem:console main.obj sub.lib
出现错误:
LINK : warning LNK4044: unrecognized option "sussystem:console"; ignored
LINK : fatal error LNK1221: a subsystem can't be inferred and must be defined
解决办法:原来我忘记删东西了
但是现在还是上面的哪个问题,怎么办?
用includelib的方法,在main.sub里加上includelib sub.lib,重新编译
成功
妈蛋

好了,我们来总结一下汇编两个文件如何编译成一个可执行程序

  1. 把sub.asm通过include sub.asm导入进去,实际上就是在include位置把sub.asm的代码完全拷贝,在ml的时候就已经导入进去并生成obj文件,因此不用在link的时候添加sub.obj,但是要注意什么事情呢,就是要像在一个文件里写那样,不能再重复引用一些文件了,不然会报重的,连end也没有,也没有数据段定义,也没有code段定义,就是简单的一段函数,或者一段数据定义,如果出现end,那么很明显的是,由于main函数被放在end下面,它就会提示不存在main定义,就是这样

WARNING Duplicate include file windows.inc

就是这个出错提示

记得区分大小写,高级汇编支持判断大小写的

  1. 通过public和extrn的办法,对于变量,能通过public和extrn,但是对于函数,却只能使用proto(对于masm6而言),用invoke来调用函数,子程序先声明后调用,用proc伪指令,先调用后声明用proto伪指令,proto就是告诉编译器,调用的子程序,定义这条指令的后边,也就是说,proto是声明伪指令,proc为定义伪指令,32位汇编增加了PROTO-INVOKE组合,也兼容PROC-CALL组合,另外,proto的另一个重要功能是指定程序的外部过程,默认情况下,MASM使所有的过程都是public属性,即允许它们能被同一程序中任何其他模块调用,在后面使用限定词private可以覆盖这个属性。。。扯远了,对于两个obj链接而言,sub.asm这时候就像一个更加独立的模块了,它有自己的data,code,外加一个不带标识符的end,使用obj的好处就是它能够同时定义data和code,而且独立性更强,它可以自己include别的文件,但是在link的时候,就需要同时点明两个文件,并且第一个obj文件会生成exe文件。
  2. 通过lib库,之所以把sub.asm编译成lib库,是因为lib库是二进制文件,不仅具有保密性,而且在include的时候也是非常智能的
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,695评论 0 3
  • 问题: 背景: 工作中开发的CookieTool工具是一个MFC的程序,如果选择以共享dll中使用MFC的方式,那...
    unsummon阅读 3,509评论 1 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,738评论 0 10
  • Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开...
    Java小铺阅读 5,960评论 0 4
  • 从某一个时间结点开始,我不再能做出五彩斑斓的梦 有人说,长大是伴随着眼睛里的光芒不断减弱的过程,是亮晶晶的瞳孔变成...
    十里0927阅读 51评论 0 0