Как загрузить ядро из диска с интервалом BIOS, 13-м в блоке NASM?

Чтобы избежать дальнейших ответов, таких как у jwp, обратите внимание, что для этого проекта мне абсолютно необходимо, чтобы моя программа была автономным исполняемым файлом, потому что абсолютно невозможно иметь виртуальную машину Python на целевой платформе, где будет выполняться исполняемый файл. У меня точно такой же hw для компиляции, так что, к счастью, мне не нужно кросс-компилировать (но я бы занялся разработкой для более дружественного Linux).

Я также хотел бы проверить, компилируется ли мой код в Cython с самого начала, не для преждевременной оптимизации, а просто для того, чтобы быть уверенным, что я не захожу слишком далеко с использованием несовместимых функций, что потребует болезненных рефакторинг, если Cython будет серьезно необходим.

Если вам нужно иметь отдельный исполняемый файл, вам не нужно запускать Cython. Для этого есть несколько хороших библиотек:

Однако, чтобы запустить код Python, вам просто нужно установить интерпретатор или виртуальную машину на целевой машине в той или иной форме. Решения, которые я представил, включают просто встраивание интерпретатора, чтобы облегчить его установку. На самом деле, я почти уверен (но могу ошибаться), что Cython не позволит вам создавать автономные исполняемые файлы. Он в основном предназначен для создания расширений интерпретатора Python.

Однако есть несколько других альтернатив. Если у вас есть интерпретатор Java на целевой машине, вы можете запустить Jython . Также есть IronPython для .net. Однако вам все равно придется распространять среды выполнения для этих языков вместе с вашим проектом.

Короче говоря, если вам нужен автономный исполняемый файл без зависимостей, ваш единственный вариант - использовать прямой C или C ++.

10
задан Ciro Santilli 新疆改造中心法轮功六四事件 28 October 2015 в 18:15
поделиться

4 ответа

jmp [es:bx] doesn't jump to the address es:bx. This command does a near jump to the address stored in the word at es:bx. This is why lots of older assemblers made you spell this kind of instruction as jmp word ptr [es:bx] or even jmp near ptr [es:bx]; it's clearer this way what is going to happen. What you probably want here is a far jump to a fixed location:

; jmp far 8000:0000
db 0eah
dw 00000h ; offset
dw 08000h ; segment

If you do want to jump to es:bx, use retf:

push es
push bx
retf
7
ответ дан 4 December 2019 в 00:25
поделиться

Я не уверен, чего вы пытаетесь достичь с помощью кода, но, если я правильно понимаю, вы хотите прочитать несколько секторов с диска в местоположение 0x8000 и затем выполнить этот код?

Если это так, то вам придется явно выполнить ВЫЗОВ / ПЕРЕХОД в это конкретное место. BIOS не будет вызывать этот код за вас. При загрузке, после инициализации BIOS, он установит IP-адрес указателя инструкции на адрес 0x7c00. Затем ЦП начнет выполнять код последовательно, поэтому без JMP / CALL до 0x8000 он не будет выполнять код с 0x8000, пока не выполнит каждый адрес памяти между 0x7c00 и 0x8000 и т. Д.

Таким образом, решение было бы иметь jmp или вызовите инструкцию после вашего jc readdisk.

Если я неправильно понял, прошу прощения. Надеюсь это поможет.

2
ответ дан 4 December 2019 в 00:25
поделиться

One gotcha with INT13 is that head and track numbers start at 0, but sector numbers for some reason start at 1. You might check that your sector-writing utility conforms to this numbering scheme.

Questions:

  • How many dots do you see when you boot?
  • Does the floppy motor kick on?
2
ответ дан 4 December 2019 в 00:25
поделиться

Я не знаю, используете ли вы дискету для загрузки своей ОС, но если вы ее используете, я предлагаю вам объявить некоторые вещи после объявления ORG и Bits, посмотрите (они очень важны):

JMP short main   ; Jump past disk description section
NOP              ; Pad out before disk description

; ------------------------------------------------------------------
; Disk description table, to make it a valid floppy
; Note: some of these values are hard-coded in the source!
; Values are those used by IBM for 1.44 MB, 3.5 diskette

OEMLabel            db "BERL OS"    ; Disk label - 8 chars
BytesPerSector      dw 512          ; Bytes per sector
SectorsPerCluster   db 1            ; Sectors per cluster
ReservedForBoot     dw 1            ; Reserved sectors for boot record
NumberOfFats        db 2            ; Number of copies of the FAT
RootDirEntries      dw 224          ; Number of entries in root dir
LogicalSectors      dw 2880         ; Number of logical sectors
MediumByte          db 0F0h         ; Medium descriptor byte
SectorsPerFat       dw 9            ; Sectors per FAT
SectorsPerTrack     dw 18           ; Sectors per track (36/cylinder)
Sides               dw 2            ; Number of sides/heads
HiddenSectors       dd 0            ; Number of hidden sectors
LargeSectors        dd 0            ; Number of LBA sectors
DriveNo             dw 0            ; Drive No: 0
Signature           db 41           ; Drive signature: 41 for floppy
VolumeID            dd 00000000h    ; Volume ID: any number
VolumeLabel         db "BERL OS"    ; Volume Label: any 11 chars
FileSystem          db "FAT12"      ; File system type: don't change!

; End of the disk description table
; ------------------------------------------------------------------

Это хорошая идея.

С уважением.

1
ответ дан 4 December 2019 в 00:25
поделиться