почему адресация неправильная?в коде загрузочного сектора реального режима x86 - PullRequest
1 голос
/ 12 апреля 2019

Получите «УФ», напечатанное где-то около центра экрана, в то время как «УФ» должно быть напечатано в самом верхнем левом углу экрана, при попытке записать две буквы «УФ» в видеопамять (0xb8000), в загрузочном секторе в реальном режиме x86 с использованием сборки GAS AT & T.

Используемая команда:

as os1.s -o os1.o;ld os1.o -o os1 -Ttext=0x7c00 --oformat=binary;sudo qemu-system-x86_64 -cpu max -drive format=raw,file=os1

Предположение об ошибке связано с адресной памятью. %bx должно быть начальным числом 0, сохраненным в памяти scn_pos. Пока что-то около 1000. Не знаю почему.


.code16          #! tells the assembler to generate 16-bit code
.globl _start
                    #.section .data
.section .text
_start:
movw $0x0d55, %ax
call write_screen
movw $0x0d56, %ax
call write_screen
jmp .
write_screen:
    push %ds
    pushl %ebx
    mov $0xb800, %bx  #! 0xb800 changes to scn_sel at 32-bit mode
    mov %bx,%ds
    mov scn_pos, %bx
    mov %ax, (%bx) # write to screen
    add $2, %bx
    cmp $2000, %bx
    jb 1f
    mov $0, %bx
1:  mov %bx, scn_pos
    popl %ebx
    pop %ds
    ret
scn_pos:
    .word 0x0    #! needs to be 32-bit at 32-bit mode
.org 510
.word 0xAA55

«УФ» должен быть напечатан в самом начале экрана, а не где-то в центре экрана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...