問題 :
外部プロシージャへの FAR CALL が常に CS:IP=0000:0000 にジャンプするように設定されているのはなぜですか? デバッガー「CodeView」によってトレースされると、実際の手順は含まれません。
4 つの異なるファイルで 4 つのパブリック プロシージャを作成します。最初の 3 つの呼び出しは正常に機能しますが、4 番目の呼び出しは CALL 0000:0000 にアセンブルされます。
最初の 3 つの呼び出しにコメントを付けても、結果は同じになります。
コード :
Pro.asmの内部[主な手順を含む]
最初の数行には、extrn 宣言が含まれています。
EXTRN WelScr:FAR
EXTRN RdImgs:FAR
EXTRN DispImgs:FAR
EXTRN MouseAct:FAR
次に、メイン内で次の呼び出しを実行します。
Main_prog PROC FAR
CALL WelScr
CALL RETURN ; another procedure declared inside Pro.asm
CALL ClrScr
CALL RdImgs
;getch() for debug purpose
MOV AH,00
INT 16H
CALL DispImgs
CALL MouseAct ;**Here is the problem**
;Return to DOS
MOV AH,4CH
INT 21H
Main_prog endp
Mouseact.asm 内で最初にプロシージャ名を PUBLIC として宣言し、次に 2 つのマクロを宣言してから、外部プロシージャの宣言を行います。
PUBLIC MouseAct
DISPIM1 MACRO SR,SC,dArr
MOV SI,SC;Start Column Pixel
MOV DX,SR;Start Rwo Pixel
LEA DI,dArr+2 ;image data strats from here
CALL DispFile1
DISPIM1 ENDM
ChkClk MACRO i
LOCAL E
CMP DX,75*i
JB RT
CMP DX,75*i+70
JA E
INC ClickNum
CMP ClickNum,2
JE RT ; A lable inside the Mouseact Procedure
MOV ItemNum,i
JMP LOP
E:
ChkClk ENDM
手順自体:
Code_segment_name segment
MouseAct PROC FAR
.
.
;the procedure contents are here
.
.
RETF
MouseAct ENDP
MouseAct プロシージャに必要な別のプロシージャ:
DispFile1 PROC
.
.
;the procedure contents are here
.
.
RET
DispFile1 ENDP
Code_segment_name ends
end
他の外部プロシージャ リストとは異なり、DispFile1 プロシージャ名も含まれていない MouseAct.lst [リスト ファイル] も添付されています。
Microsoft (R) Macro Assembler Version 5.10 12/20/15 05:18:0
Symbols-1
Macros:
N a m e Lines
CHKCLK . . . . . . . . . . . . . 0
DISPIM1 . . . . . . . . . . . . 12
Symbols:
N a m e Type Value Attr
MOUSEACT . . . . . . . . . . . . F PROC 0000 Global Length = 0000
@CPU . . . . . . . . . . . . . . TEXT 0101h
@FILENAME . . . . . . . . . . . TEXT mouseact
@VERSION . . . . . . . . . . . . TEXT 510
0 Source Lines
0 Total Lines
13 Symbols
47570 + 451498 Bytes symbol space free
0 Warning Errors
0 Severe Errors