を与える私はメモリに移動命令がエラー
を他の場所にコードを移動するための方法を考え出す傾けるので、私はこのような方法でいくつかのことを置くが、それは
を動作しません。extern _transfer_code_segment
extern _kernel_segment
extern _kernel_reloc
extern _kernel_reloc_segment
extern _kernel_para_size
section .text16
global transfer_to_kernel
transfer_to_kernel:
;cld
;
; Turn off interrupts -- the stack gets destroyed during this routine.
; kernel must set up its own stack.
;
;cli
; stack for only for this function
push ebp
mov ebp, esp
mov eax, _kernel_segment ; source segment
mov ebx, _kernel_reloc_segment ; dest segment
mov ecx, _kernel_para_size
.loop:
; XXX: Will changing the segment registers this many times have
; acceptable performance?
mov ds, eax ;this the place where the error
mov es, ebx ; this to
xor esi, esi
xor edi, edi
movsd
movsd
movsd
movsd
inc eax
inc ebx
dec ecx
jnz .loop
leave
ret
は、セグメント・レジスタのサイズはすべて16ビットでそれを行うための他の方法を持っているか、どのようにこの問題を解決することができる
ありがとう、大きなリアルモードは助けられましたが、私は関数から戻ってきましたが返されません。 – sakura
@sakura:古い16ビットモードにはほとんど関心がありません。私はそれについて、私がこの答えを書くことができた唯一の理由である(それが喜んで助けた、BTW)ということでそれについて読んでいる。私が推奨できるのは、良いデバッガを入手することです。 BOCHSに組み込まれているので、カーネルをシングルステップで実行できます。 –
この質問の詳細については、後で明らかになりましたが、なぜこのコピーを行う前に32ビット保護モードに切り替えるだけではないのだろうかと疑問に思っています。カーネルが最終的にやることになっていると思われます。なぜリアルモードに戻したいのですか? 「非現実的なモード」であっても、私が知る限り、1 MBを超えることはできませんので、これはまさに銀色の弾丸の解決策ではありません。 @sakura –