2017-05-07 34 views
1

遞增64位內存有效地址我使用的中斷0x13與擴展驅動器0x42的功能讀取從我的擴展驅動器部門在實模式。如何在實模式

我定義DAP是在下面的結構的16個字節:

DAP: 
    db 0x10  ; size of DAP 
    db 0   ; Reserved zero 
    dw 0x0001  ; Number of sectors to read 
    dd 0x00000200 ; Memory Location to load the sector (s) 
    dq 0   ; Start of the sectors to be read 

的DAP段是8字節長的,你可以注意到。在尋找我的部門(循環部門)時,我增加了部分並將其與我的驅動器的實際大小進行比較。我使用遞增錯誤的代碼被限制在16位模式:

mov  ax, [DAP+0x08] 
inc  ax 
mov  [DAP+0x08], ax 

我不想使用幾種通用寄存器在複雜的尋址模式來實現我的目的,我想你有一些簡單而有效的方式。

+0

段不是8字節(64位值)。您列出的8字節值是LBA(邏輯塊地址)。細分市場。實際上是你列爲'offset'的第二個2字節。您列爲'offset'的四個字節值實際上是一個實模式片段:偏移量對。 –

+0

@MichaelPetch,你對我的代碼評論是正確的。這是由於從某處複製部分代碼的錯誤所致。無論如何,我修改了代碼評論。 –

+0

4字節值在0x200實際上是相同的0x00000200其轉換爲一個段偏移對0×0000:0200。我希望這不是你開始讀扇區的內存中的地方,因爲它恰好位於運行從0x0000到0x3fff的較低內存中的中斷向量表之上。之後是從0x400到0x4ff的BIOS數據區。在古代硬件上,保留字節從0x500開始。我建議開始讀取0x0000:0x0600 –

回答

4

要增加一個64位QWORD,您可以使用addadc說明:

ADD WORD [DAP+ 8], 1 
ADC WORD [DAP+10], 0 
ADC WORD [DAP+12], 0 
ADC WORD [DAP+14], 0 

或者,如果你的目標不是8088,8086,或80286,您還可以使用32位加/ ADC:

ADD DWORD [DAP+ 8], 1 
ADC DWORD [DAP+12], 0 

請注意,您不能使用INC WORD [DAP+ 8]代替ADD WORD [DAP+ 8], 1,因爲前者不會設置進位標誌。

+0

謝謝@FUZ。我正在使用NASM,他們現在不適合我,我會回來的。 –

+3

@fuz:或者如果你有一個('FILD qword [DAP + 8]/FLD1/FADDP/FISTP qword [DAP + 8]'),你可以直接路由並濫用FPU。無可否認,但x87具有足夠的精度和正確的溢出語義來做正確的事情。 – doynax

+0

@doynax事實上,這可行,但它可能會更糟。 – fuz