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吧
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
但是这样的话会出现forward reference needs override..
#3
已经可以运行啦,谢谢!
但是运行的速度慢了很多。。不知道是为何
#4
#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吧
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
但是这样的话会出现forward reference needs override..
#3
已经可以运行啦,谢谢!
但是运行的速度慢了很多。。不知道是为何