当前位置: 代码迷 >> 汇编语言 >> 汇编LINK 时失误 求大神
  详细解决方案

汇编LINK 时失误 求大神

热度:4718   发布时间:2013-02-26 00:00:00.0
汇编LINK 时出错 求大神
错误是fatal errorL1103:attempt to access data outside segment bounds pos :EF Record type :8A

date segment
one db 'Monday','$'
two db 'Tuesday','$'
three db 'Wednesday','$'
four db 'Thursday','$'
five db 'Friday','$'
six db 'Saturday','$'
seven db 'Sunday','$'
address dw offset one,offset two,offset three,offset four,offset five,offset six,offset seven
date ends
code segment 
assume ds:date,cs:code
mov ax,date
mov ds,ax
mov ah,1
int 21h
weekday al
mov ah,4ch
int 21h weekday macro num 
mov bl,al
and bx,1
mov si,offset address
dec bx
add bx,bx
mov dx,[si+bx]
mov ah,9
int 21h
endm
code ends
end




------解决方案--------------------------------------------------------
你输入的数字在AL保存的是ASC码,比如说输1时,就是31,你按31去查地址,就越界了。
------解决方案--------------------------------------------------------
LINK 时有错误?好像编译都过不去吗?将宏定义挪到程序的开始处吧,至少在引用它的地方之前。
程序功能上,除了楼上朋友说的,在宏定义里,BH 须先置 0,and bx, 1 指令多余吧,也没有对输入值的范围进行合理性判定。
------解决方案--------------------------------------------------------
weekday macro num
mov bl,al
sub bl,30h ;← 你输入的数字在AL保存的是ASC码,比如说输1时,就是31,你按31去查地址

mov si,offset address
dec bx
add bx,bx
mov dx,[si+bx]
mov ah,9
int 21h
endm
date segment
one db 'Monday','$'
two db 'Tuesday','$'
three db 'Wednesday','$'
four db 'Thursday','$'
five db 'Friday','$'
six db 'Saturday','$'
seven db 'Sunday','$'
address dw offset one,offset two,offset three,offset four,offset five,offset six,offset seven
date ends
code segment
assume ds:date,cs:code
start: ;← start
mov ax,date
mov ds,ax
mov ah,1
int 21h
weekday al
mov ah,4ch
int 21h 
code ends
end start ;← start
;masm5.0编译通过,正常显示。

;宏需要先定义,再调用。
按LZ的方式,mov ah, 4ch int 21h 执行完后,接着往下执行的。
  相关解决方案