16位汇编:文件名长度导致的LINK:Unresolved Externals错误
2015-11-26 23:42
246 查看
题目来源于《80X86汇编语言程序设计教程》(清华大学出版社)
代码如下:
两个模块,第一个模块有一个数据段data和一个代码段code;第二个模块中有一个data数据段和一个func代码段;
链接时,从模块中的data段会覆盖主模块中的data数据段以达到模块间传递参数的功能。
模块文件的中的开头处有最初的文件名。
然后链接出错:
![](http://img.blog.csdn.net/20151126233624310?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
解决方法:几经波折,当我修改了文件showtimen.asm的文件名后(长度由原先的9减少),问题解决了,成功链接!
总结:文件名的长度可能会影响到链接!出现,很难察觉的错误。当然,现在编译器和链接器或许不会出现这种错误了。文件名的(除过后缀之后)长度应该小于等于8.。
代码如下:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;filename: showtime.asm ;function: 显示系统时间主模块 ;author: Warning_ROO ;date: 2015-11-26 20:35:24 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EXTRN GetDate:FAR stack SEGMENT STACK DW 1024 DUP(0) stack ENDS ;数据段 data SEGMENT COMMON MESS DB "Current date is " MESS1 DB 2 DUP(?) DB '-' MESS2 DB 2 DUP(?) DB 0DH,0AH,'$' data ENDS ;代码段 code SEGMENT ASSUME cs:code, ds:data, ss:stack start: mov ax, data mov ds, ax call GetDate mov dx, OFFSET MESS mov ah, 09H int 21H mov ax, 4C00H int 21H code ENDS END start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;filename: showtimen.asm<span style="white-space:pre"> </span>;最初的文件名 ;function: 显示系统时间辅助模块 ;author: Warning_ROO ;date: 2015-11-26 20:39:17 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PUBLIC GETDATE ;数据段 data SEGMENT COMMON MESS DB "Current date is " MESS1 DB 2 DUP(0) DB '-' MESS2 DB 2 DUP(0) DB 0DH,0AH,'$' year DW ? month DB ? day DB ? data ENDS ;代码段 func SEGMENT ASSUME cs:func, ds:data ;********************************************************************* ;name: GetDate ;function: 利用dos中断获取日期信息 ;entry: 无 ;export: ASCII串填入约定缓冲区 ;illustration: NONE ;********************************************************************* GetDate PROC FAR push ax push bx push cx push dx push si pushf mov ah, 2AH int 21H mov year, cx mov month, dh mov day, dl mov al, month mov bx, LENGTH MESS1 mov si, OFFSET MESS1 call ToASC mov al, day mov bx, LENGTH MESS2 mov si, OFFSET MESS2 call ToASC popf pop si pop dx pop cx pop bx pop ax ret GetDate ENDP ;********************************************************************* ;************************************************************************* ;name: ToASC ;function: 将一个8位二进制数转换为响应十进制数的ASCII码串 ;entry: al中保存着欲转化的二进制数; ; bx中保存着十进制数的最少位数 ; ds:[si]中存放ASCII码串的缓冲区首地址 ;export: 响应的ASCII码串在相应的缓冲区中 ;illustration:近过程 ;************************************************************************ ToASC PROC NEAR push ax push bx push cx pushf mov cl, 10 ToASCReturn: xor ah, ah div cl add ah, 30H mov [si+bx-1], ah dec bx jnz ToASCReturn popf pop cx pop bx pop ax ret ToASC ENDP ;************************************************************************ func ENDS END
两个模块,第一个模块有一个数据段data和一个代码段code;第二个模块中有一个data数据段和一个func代码段;
链接时,从模块中的data段会覆盖主模块中的data数据段以达到模块间传递参数的功能。
模块文件的中的开头处有最初的文件名。
然后链接出错:
解决方法:几经波折,当我修改了文件showtimen.asm的文件名后(长度由原先的9减少),问题解决了,成功链接!
总结:文件名的长度可能会影响到链接!出现,很难察觉的错误。当然,现在编译器和链接器或许不会出现这种错误了。文件名的(除过后缀之后)长度应该小于等于8.。
相关文章推荐
- Function: pthread_create
- 杭电1491Octorber 21st(数学)
- MPMoviePlayerController 电影播放器—IOS开发
- unrecognized selector sent to instance
- js局部变量 全局变量
- ORM之一:适合我的ORM
- 在其他对象上同步
- 拷贝构造函数、拷贝函数、析构函数
- 自学android(1) activity
- Unique Paths
- 学习ASP.NET 5和MVC6
- D3中selection之使用
- 2015.11.26 接下来学习方向的一些想法——尝试学习后台开发
- Java web 学习路线
- HDU 2646 栈的应用 STL
- IOS之KVC和KVO(未完待续)
- 自定义控件学习之canvas和paint相关知识点学习
- android 数字进度条--NumberProgressBar
- 关于This Handler class should be static or leaks might occur的解决办法
- java佩恩沃星球打怪掉血实现