Вывести строку в реальном режиме с помощью FASM - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь вызвать функцию прерывания BIOS 10h 0Eh (вывод телетайпа), чтобы напечатать строку в реальном режиме (тестирование с QEMU).В NASM у меня нет проблем, программа правильно печатает строку:

bits 16                             ; Use 16 bit code
section .text

boot:
    xor ax, ax                      ; Clear AX register
    mov ds, ax                      ; Clear DS register
    mov es, ax                      ; Clear ES register
    mov ss, ax                      ; Clear SS register
    mov si, hello                   ; Set SI to string
    mov ah, 0x0E                    ; Set function
.loop:
    lodsb                           ; Store character into AL
    or al, al                       ; Check for NULL end
    jz halt                         ; On NULL end
    int 0x10                        ; Call 10h interrupt
    jmp .loop                       ; Continue with next character
halt:
    cli
    hlt

hello: db "Hello, World!", 0

times 510 - ($-$$) db 0
dw 0xAA55

Я создаю образ дискеты со следующими порядками:

nasm -f elf64 boot.asm -o boot.o
ld -Ttext 0x7c00 boot.o -o boot.out
objcopy -O binary -j .text boot.out boot.bin
dd if=/dev/zero of=floppy.img bs=1024 count=720
dd if=boot.bin of=floppy.img conv=notrunc

Но в FASM выделенный текст не печатает строку правильно:

format elf64
use16
section '.text'
org 0x0

boot:
    cld                             ; Clear direction flag
    xor ax, ax                      ; Clear AX register
    mov ds, ax                      ; Clear DS register
    mov es, ax                      ; Clear ES register
    mov ss, ax                      ; Clear SS register
    mov si, hello                   ; Set SI to string
    mov ah, 0x0E                    ; Set function
puts:
    lodsb                           ; Store character into AL
    or al, al                       ; Check for NULL end
    jz halt                         ; On NULL end
    int 0x10                        ; Call 10h interrupt
    jmp puts                        ; Continue with next character
halt:
    cli
    hlt

hello: db "Hello, World!", 0

times 510 - ($-$$) db 0
dw 0xAA55

А для создания образа дискеты:

fasm boot.asm boot.o
ld -Ttext 0x7c00 boot.o -o boot.out
objcopy -O binary -j .text boot.out boot.bin
dd if=/dev/zero of=floppy.img bs=1024 count=720
dd if=boot.bin of=floppy.img conv=notrunc

Чего мне не хватает?

1 Ответ

0 голосов
/ 15 июня 2018

FASM может напрямую генерировать двоичные и исполняемые файлы.Фактически, использование FASM с объектными файлами и компоновщиком необходимо только в том случае, если вы хотите использовать код вместе с каким-либо языком высокого уровня.

На самом деле это свойство FASM вместе с его высокой переносимостью делает FASM излюбленным ассемблером разработчиков ОС.

Кроме того, BIOS установит регистры сегментов на 0 и установит SP на некоторое разумное значение.значение, так что вам не нужно устанавливать их вообще.

Вот ваш код, вырезанный из ненужных частей и с соответствующими директивами (boot.asm):

        format binary as "bin"
        use16
        org     7c00h

boot:
        cld                     ; Clear direction flag

        mov     si, hello       ; Set SI to string
        mov     ah, 0x0E        ; Set function
puts:
        lodsb                   ; Store character into AL
        or      al, al          ; Check for NULL end
        jz      halt            ; On NULL end
        int     0x10            ; Call 10h interrupt
        jmp     puts            ; Continue with next character
halt:
        cli
        hlt

hello   db "Hello, World!", 0   ; don't use ":" for the data definitions.

        times 510 - ($-$$) db 0
        dw 0xAA55

После компиляции вы получите непосредственно правильно скомпилированный двоичный файл: boot.bin;

Ниже приведены минимальные команды для запуска загрузочного сектора:

$fasm boot.asm
$qemu-system-x86_64 -drive format=raw,media=disk,if=floppy,file=./boot.bin

Обратите внимание, что вы можете передать двоичный файл непосредственно в эмулятор qemu, не создавая специальный файл floppy.img.

...