FAR Call 设置为跳转到段零和偏移零在 8086 程序集中没有列表
FAR Call is set to jump to segment zero and offset zero in 8086 Assembly with no listings
问题:
是什么使得对外部程序的 FAR CALL 总是跳转到 CS:IP=0000:0000?
当调试器跟踪时 "CodeView" 不包含实际过程。
我在四个不同的文件中制作了四个 public 过程,前三个调用正常工作,但第四个调用被组装为:CALL 0000:0000 .
注释前三个调用结果相同。
代码:
里面Pro.asm[里面包含了主程序]
前几行包含 extrn 声明
EXTRN WelScr:FAR
EXTRN RdImgs:FAR
EXTRN DispImgs:FAR
EXTRN MouseAct:FAR
然后在 main 中执行以下调用:
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
然后在外部过程声明完成后声明两个宏
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
还附上了MouseAct.lst[列表文件],它与其他外部程序列表不同,也不包含 DispFile1 程序名称。
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
经过一些挖掘;我发现通过 macro_name endm 结束宏定义部分
即在上面的例子中:
DISP1M1 宏的 DISPIM1 ENDM 和 ChkClk 宏的 ChkClk ENDM 使汇编程序停止汇编文件的其余部分,从而导致过程全局长度 = 0
使宏结束是 ENDM 现在一切正常。
问题:
是什么使得对外部程序的 FAR CALL 总是跳转到 CS:IP=0000:0000? 当调试器跟踪时 "CodeView" 不包含实际过程。
我在四个不同的文件中制作了四个 public 过程,前三个调用正常工作,但第四个调用被组装为:CALL 0000:0000 .
注释前三个调用结果相同。
代码:
里面Pro.asm[里面包含了主程序]
前几行包含 extrn 声明
EXTRN WelScr:FAR
EXTRN RdImgs:FAR
EXTRN DispImgs:FAR
EXTRN MouseAct:FAR
然后在 main 中执行以下调用:
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 然后在外部过程声明完成后声明两个宏
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
还附上了MouseAct.lst[列表文件],它与其他外部程序列表不同,也不包含 DispFile1 程序名称。
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
经过一些挖掘;我发现通过 macro_name endm 结束宏定义部分 即在上面的例子中: DISP1M1 宏的 DISPIM1 ENDM 和 ChkClk 宏的 ChkClk ENDM 使汇编程序停止汇编文件的其余部分,从而导致过程全局长度 = 0 使宏结束是 ENDM 现在一切正常。