FAR Call настроен на переход к нулевому сегменту и смещению нуля в сборке 8086 без списков

Проблема:

Что заставляет FAR CALL к внешней процедуре всегда устанавливать переход на CS:IP=0000:0000? который при отслеживании отладчиком "CodeView" не содержит фактической процедуры.

Я делаю четыре открытые процедуры в четырех разных файлах, первые три вызова работают правильно, но четвертый вызов собран так: CALL 0000:0000 .

Комментирование первых трех вызовов приводит к одинаковому эффекту.

Код:

Внутри 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, затем два макроса были объявлены после того, как было сделано объявление внешней процедуры.

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

1 ответ

Решение

После некоторых копаний; Я обнаружил, что завершение части определения макроса с помощью имени макроса endm, то есть в приведенном выше примере: ENDM DISPIM1 для макроса DISP1M1 и ENDM ChkClk для макроса ChkClk заставляет ассемблер прекратить сборку остальной части файла, что приводит к тому, что глобальная длина процедуры =0 делает макрос конец - это ENDM, только теперь все в порядке.

Другие вопросы по тегам