您的位置:首页 > 其它

16位汇编:文件名长度导致的LINK:Unresolved Externals错误

2015-11-26 23:42 246 查看
题目来源于《80X86汇编语言程序设计教程》(清华大学出版社)

代码如下:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;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.。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: