2012-06-22 55 views
1

我知道我成功地使用int 13h將我的代碼寫入該地址,因爲我可以在該內存位置看到它。我不能做的就是跳到那裏。不能得到16位彙編程序跳轉到0x1000:0x0000

我把0x1000(三個零那裏)到es0x0000bx,我知道[es:bx]指不等於0x10000(4個出現零)由(es * 0x10) + bx計算的地址。但是eip,指令指針永遠不會去那裏。

我試過jmp [es:bx],jmp 0x1000:0x0000,以及其他一些NASM甚至不接受的排列組合。

我的引導裝載程序,因爲它目前是(它仍然不工作)是here。我在Qemu啓動它,並且在前012個字節上做了一個memsave,在0x10000處打開它,並在那裏看到了我的「內核」代碼(簡單,但EIP仍然拒絕0x10000,或者到達它,然後掛在哪裏我想要它,就是我的意思)。形勢的完整形象here

+1

編輯我的壞你提供的代碼。 – chadpeppers

+2

在16位程序中設置EIP將會很困難,這是一個32位寄存器。跳轉後IP的值將爲0。 –

+0

@Pete - 'jmp [es:bx]'將間接跳轉到存儲在[[es:bx]'處的地址。但是,'jmp seg:offset'或'jmp far seg:offset'應該可以工作。而且,就像Hans所說的那樣,在0x1000:0時,你將擁有'CS = 0x1000'和'IP = 0'。 –

回答

1

遠跳不能使用僅用於段的內存位置。這裏有幾種方法可以做到這一點:

1)段和偏移量的簡單硬編碼地址。

jmp 0x1000:0 

2)使用一個完整的地址間接跳轉:

entry dw 0x0000 ; offset 
     dw 0x1000 ; segment 

jmp far dword ptr [entry] ; far jump (syntax might differ) 

3)遠返回

push SYSADDR ; segment 
push 0  ; offset 
retf   ; far return 

在DOS時使用慣常的伎倆被修補按照壓:

mov ax, SYSADDR 
    mov word ptr [myjump+1], ax 
myjump: 
    jmp 0x0000:0x0000 

或使用它的一部分作爲變量:

myjump: 
    db 0xEA   ; far jmp opcode 
    dw 0x0000   ; offset part 
    SYSADDR dw 0x1000 ; segment part 

聲明:以上所有內容均來自內存,我可能會得到一些錯誤的部分(例如,段/偏移量的順序非常混亂)。

0

你應該能夠做到你正在嘗試的。這是一個例子,可能是出於同樣的原因:

; http://www.free2code.net/tutorials/view/writing_your_own_operating_system-12/page1.html 
... 
mov bx,0x1000 ;Es and Bx put together are where to load the program too 
       ; (see jmp x1000:0x00) 
mov es,bx 
mov bx,0x00 
int 13h  ;Int 13 is all functions for disks 
...