拜託我。一個段只有64KB長。所以如果段寄存器的值不被改變,那麼一個程序最大可以有64KB的大小。如何爲8086處理器編寫大於64KB的程序?
假設我們想爲8086系統寫一個大於64KB的程序。當然,它需要在程序中間改變段寄存器的值。我們是否明確地在程序內部更改它,或者我們只是編寫代碼並讓操作系統處理它?像DOS這樣的操作系統如何處理這樣大的程序?
拜託我。一個段只有64KB長。所以如果段寄存器的值不被改變,那麼一個程序最大可以有64KB的大小。如何爲8086處理器編寫大於64KB的程序?
假設我們想爲8086系統寫一個大於64KB的程序。當然,它需要在程序中間改變段寄存器的值。我們是否明確地在程序內部更改它,或者我們只是編寫代碼並讓操作系統處理它?像DOS這樣的操作系統如何處理這樣大的程序?
x86處理器有JMP
和CALL
的變種,其中您指定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 foobar
和foobar
位於不同的段,儘管我不能命名任何示例,因爲這不是我測試過的。
如果您的程序將被編譯爲.com文件,那麼您的代碼不能大於〜63 KB。 如果要添加代碼,則必須將該代碼寫入單獨的文件並在運行時從文件加載代碼。 要創建數組或在已加載.com文件的段外添加代碼或數據,您必須預留空閒內存。 爲此,請使用DOS功能預留空閒空間。在執行此操作之前,使用DOS函數返回程序期望使用當前段的空間內存。
也許它得到16,然後最後4個有兩個時鐘週期? – Leonardo