2013-10-17 30 views
0

拜託我。一個段只有64KB長。所以如果段寄存器的值不被改變,那麼一個程序最大可以有64KB的大小。如何爲8086處理器編寫大於64KB的程序?

假設我們想爲8086系統寫一個大於64KB的程序。當然,它需要在程序中間改變段寄存器的值。我們是否明確地在程序內部更改它,或者我們只是編寫代碼並讓操作系統處理它?像DOS這樣的操作系統如何處理這樣大的程序?

+0

也許它得到16,然後最後4個有兩個時鐘週期? – Leonardo

回答

1

x86處理器有JMPCALL的變種,其中您指定CS(代碼段寄存器)的新值。這被稱爲farJMP/CALL,並且不同彙編器之間的確切語法不同。如果我們使用NASM作爲一個例子,你會寫:

; Do an inter-segment jump to the label named foobar 
jmp (seg foobar):foobar 

; Do an inter-segment call to the subroutine named foobar 
call (seg foobar):foobar 

有可能是裝配的是有足夠的智慧找出產生一個遠跳轉,即使你只是寫jmp foobarfoobar位於不同的段,儘管我不能命名任何示例,因爲這不是我測試過的。

0

如果您的程序將被編譯爲.com文件,那麼您的代碼不能大於〜63 KB。 如果要添加代碼,則必須將該代碼寫入單獨的文件並在運行時從文件加載代碼。 要創建數組或在已加載.com文件的段外添加代碼或數據,您必須預留空閒內存。 爲此,請使用DOS功能預留空閒空間。在執行此操作之前,使用DOS函數返回程序期望使用當前段的空間內存。

相關問題