这段代码已经org到100h的位置,时间中断的函数单独测试正确,但在tlink链接时却提示错误

时间:2020-12-14 03:14:48
  这段代码已经org到100h的位置,时间中断的函数单独测试正确,但是这段代码在tlink链接时却提示invalid initial entry point address,请问是为什么呢?

extern  macro %1    ;统一用extern导入外部标识符
extrn %1
endm

extern _cmain:near

.8086
_TEXT segment byte public 'CODE'
assume cs:_TEXT
DGROUP group _TEXT,_DATA,_BSS

org 100h

jmp start
delay equ 4 ; 计时器延迟计数
count db delay ; 计时器计数变量,初值=delay
start:
mov ax,cs
mov ds,ax; DS = CS
mov es,ax; ES = CS
mov ss,ax; SS = cs
mov sp, 100h    
xor ax,ax ; AX = 0
mov es,ax ; ES = 0
mov word ptr[es:20h],offset Timer ; 设置时钟中断向量的偏移地址
mov ax,cs 
mov word ptr[es:22h],ax ; 设置时钟中断向量的段地址=CS
mov ax,0b800h
mov es,ax
mov ah,0fh
    mov al,'|'          
    mov word ptr [es:((80*24+79)*2)],ax 
call near ptr _cmain
     jmp $
Timer:
mov  ax,0B800h         ; 文本窗口显存起始地址
    mov   es,ax       ; ES = B800h
    dec byte ptr [count]        ; 递减计数变量
    jnz end              ; >0:跳转
    mov byte ptr al, [es:((80*24+79)*2)]
    cmp al,'|'
    je show0     
    cmp al,'/'
    je show1    
    cmp al,'-'
    je show2  
    cmp al,'\'
    je show3  
mov byte ptr[es:((80*24+79)*2)],'\'
;mov byte ptr[es:((80*24+79)*2)+1],0Fh
returnBack:
mov byte ptr[count],delay ; 重置计数变量=初值delay
end:
mov al,20h ; AL = EOI
out 20h,al ; 发送EOI到主8529A
out 0A0h,al ; 发送EOI到从8529A
iret ; 从中断返回
show0:
mov byte ptr[es:((80*24+79)*2)],'/'
mov byte ptr[es:((80*24+79)*2)+1],0Fh
jmp returnBack
show1:
mov byte ptr[es:((80*24+79)*2)],'-'
mov byte ptr[es:((80*24+79)*2)+1],0Fh
jmp returnBack
show2:
mov byte ptr[es:((80*24+79)*2)],'\'
mov byte ptr[es:((80*24+79)*2)+1],0Fh
jmp returnBack
show3:
mov byte ptr[es:((80*24+79)*2)],'|'
mov byte ptr[es:((80*24+79)*2)+1],0Fh
jmp returnBack

include klib.asm
_TEXT ends

_DATA segment word public 'DATA'

_DATA ends

_BSS segment word public 'BSS'
_BSS ends

end start


然后map文件是这个:
 Start  Stop   Length Name               Class

 00000H 00593H 00594H _TEXT              CODE
 00594H 00709H 00176H _DATA              DATA
 0070AH 00788H 0007FH _BSS               BSS


错误信息:Cannot generate COM file : invalid initial entry point address

5 个解决方案

#1


把中间一段改两个地方就可以了
Timer:
    mov ax,0b800h
mov es,ax
mov ax,offset count
mov si,ax
dec byte ptr cs:[si]
jnz end
mov byte ptr al,[es:((80*24+79)*2)]
cmp al,'|'
je show0
cmp al,'/'
je show1
cmp al,'-'
je show2
cmp al,'\'
je show3
mov byte ptr [es:((80*24+79)*2)],'\'

returnBack:
    mov ax,offset count
mov si,ax
    mov byte ptr [si],delay

然后把delay和count放到后面
delay equ 4
count db delay
include kliba.asm

至于为什么我也不清楚只是昨晚也遇到这个问题然后这样就链接过了,有机会再去问LYB吧

#2


引用 1 楼 acelove40 的回复:
把中间一段改两个地方就可以了
Timer:
    mov ax,0b800h
mov es,ax
mov ax,offset count
mov si,ax
dec byte ptr cs:[si]
jnz end
mov byte ptr al,[es:((80*24+79)*2)]
cmp al,'|'
je show0
cmp al,'/'
je show1
cmp al,'-'
je show2
cmp al,'\'
je show3
mov byte ptr [es:((80*24+79)*2)],'\'

returnBack:
    mov ax,offset count
mov si,ax
    mov byte ptr [si],delay

然后把delay和count放到后面
delay equ 4
count db delay
include kliba.asm

至于为什么我也不清楚只是昨晚也遇到这个问题然后这样就链接过了,有机会再去问LYB吧


但是这样的话会出现forward reference needs override..

#3


引用 1 楼 acelove40 的回复:
把中间一段改两个地方就可以了
Timer:
    mov ax,0b800h
mov es,ax
mov ax,offset count
mov si,ax
dec byte ptr cs:[si]
jnz end
mov byte ptr al,[es:((80*24+79)*2)]
cmp al,'|'
je show0
cmp al,'/'
je show1
cmp al,'-'
je show2
cmp al,'\'
je show3
mov byte ptr [es:((80*24+79)*2)],'\'

returnBack:
    mov ax,offset count
mov si,ax
    mov byte ptr [si],delay

然后把delay和count放到后面
delay equ 4
count db delay
include kliba.asm

至于为什么我也不清楚只是昨晚也遇到这个问题然后这样就链接过了,有机会再去问LYB吧

已经可以运行啦,谢谢!
但是运行的速度慢了很多。。不知道是为何

#4


该回复于2015-05-19 16:00:18被管理员删除

#5


该回复于2015-05-19 16:00:20被管理员删除

#1


把中间一段改两个地方就可以了
Timer:
    mov ax,0b800h
mov es,ax
mov ax,offset count
mov si,ax
dec byte ptr cs:[si]
jnz end
mov byte ptr al,[es:((80*24+79)*2)]
cmp al,'|'
je show0
cmp al,'/'
je show1
cmp al,'-'
je show2
cmp al,'\'
je show3
mov byte ptr [es:((80*24+79)*2)],'\'

returnBack:
    mov ax,offset count
mov si,ax
    mov byte ptr [si],delay

然后把delay和count放到后面
delay equ 4
count db delay
include kliba.asm

至于为什么我也不清楚只是昨晚也遇到这个问题然后这样就链接过了,有机会再去问LYB吧

#2


引用 1 楼 acelove40 的回复:
把中间一段改两个地方就可以了
Timer:
    mov ax,0b800h
mov es,ax
mov ax,offset count
mov si,ax
dec byte ptr cs:[si]
jnz end
mov byte ptr al,[es:((80*24+79)*2)]
cmp al,'|'
je show0
cmp al,'/'
je show1
cmp al,'-'
je show2
cmp al,'\'
je show3
mov byte ptr [es:((80*24+79)*2)],'\'

returnBack:
    mov ax,offset count
mov si,ax
    mov byte ptr [si],delay

然后把delay和count放到后面
delay equ 4
count db delay
include kliba.asm

至于为什么我也不清楚只是昨晚也遇到这个问题然后这样就链接过了,有机会再去问LYB吧


但是这样的话会出现forward reference needs override..

#3


引用 1 楼 acelove40 的回复:
把中间一段改两个地方就可以了
Timer:
    mov ax,0b800h
mov es,ax
mov ax,offset count
mov si,ax
dec byte ptr cs:[si]
jnz end
mov byte ptr al,[es:((80*24+79)*2)]
cmp al,'|'
je show0
cmp al,'/'
je show1
cmp al,'-'
je show2
cmp al,'\'
je show3
mov byte ptr [es:((80*24+79)*2)],'\'

returnBack:
    mov ax,offset count
mov si,ax
    mov byte ptr [si],delay

然后把delay和count放到后面
delay equ 4
count db delay
include kliba.asm

至于为什么我也不清楚只是昨晚也遇到这个问题然后这样就链接过了,有机会再去问LYB吧

已经可以运行啦,谢谢!
但是运行的速度慢了很多。。不知道是为何

#4


该回复于2015-05-19 16:00:18被管理员删除

#5


该回复于2015-05-19 16:00:20被管理员删除