Thursday, April 10, 2008

跨檔案Segment jmp與跨segment呼叫

當我們project越做越大的時候,多個檔案的程式開發變成不可避免的。
經過華哥的實驗,最後找出如何跨SEGMENT做jmp。
假設今天在A.asm裡頭有個A segment,想要CALL位在B.asm的B segment的B_SEG則若要能正確運作寫法如下。寫個簡單的例子在B segment印出hello world :

A.asm

.586

B SEGMENT PARA PUBLIC USE16 'b'
EXTERN B_SEG:FAR
B ENDS

A SEGMENT PARA PUBLIC USE16 'code'
ASSUME cs:A, ds:A_DATA
start:
mov dx, A_DATA
mov ds, dx
jmp B_SEG
A ENDS

A_DATA SEGMENT PARA PUBLIC USE16 'data'
PUBLIC msg
msg BYTE 'hello world$'
A_DATA ENDS

END start

B.asm

.586
A_DATA SEGMENT PARA PUBLIC USE16 'data'
EXTERN msg:BYTE
A_DATA ENDS

B SEGMENT PARA PUBLIC USE16 'b'
PUBLIC B_SEG

B_SEG::
mov dx, OFFSET msg
mov ah, 09h
int 21h

mov ax, 4C00h
int 21h

B ENDS

END

;-----------------------------------------
通常EXTERN B:NEAR ,B:FAR代表B是一個label,FAR代表是要給別的segment用的。
若在文中已經有宣告,EXTERN B:FAR時,則呼叫的時候可以不用jmp FAR PTR B。可以直接jmp B。除非是在同一個檔案裡頭跨不同的SEGMENT jmp or call才需要jmp FAR PTR or call FAR PTR。
另外若是看到EXTERN B:BYTE ,B:WORD代表,B是一個外部檔案來的變數,其型態是BYTE or WORD。
最後EXTERN B:ABS,則代表B是一個defined的常數。ex:B EQU 1234h
;-----------------------------------------
若兩個檔案都在同一個目錄底下,則編譯時可以用
ml /c /Fl a.asm b.asm ---> '/c'用意是只編譯產生.obj,'/Fl'是編譯過程產生.list檔
ml /Fm a.obj b.obj ---> 'Fm'指link過程產生map file。

1 comment:

Anonymous said...

Hello. This post is likeable, and your blog is very interesting, congratulations :-). I will add in my blogroll =). If possible gives a last there on my blog, it is about the Telefone VoIP, I hope you enjoy. The address is http://telefone-voip.blogspot.com. A hug.