Сборка: загрузчик для поддержки пользовательских клавиатур ОС - PullRequest
0 голосов
/ 02 марта 2019

У меня есть работающая простая пользовательская ОС (на данный момент ничего особенного: D).Сейчас я использую файл сборки (boot.s), который не поддерживает клавиатуру.

Файл сборки (boot.s):

# set magic number to 0x1BADB002 to identified by bootloader 
.set MAGIC,    0x1BADB002
# set flags to 0
.set FLAGS,    0
# set the checksum
.set CHECKSUM, -(MAGIC + FLAGS)
# set multiboot enabled
.section .multiboot
# define type to long for each data defined as above
.long MAGIC
.long FLAGS
.long CHECKSUM
# set the stack bottom 
stackBottom:
# define the maximum size of stack to 512 bytes
.skip 512
# set the stack top which grows from higher to lower
stackTop:
.section .text
.global _start
.type _start, @function

_start:
  # assign current stack pointer location to stackTop
    mov $stackTop, %esp
  # call the kernel main source
    call KERNEL_MAIN
    cli
# put system in infinite loop
hltLoop:
    hlt
    jmp hltLoop
.size _start, . - _start

Я думаю, что это отсутствуетчасть, но это в синтаксисе Intel, и я не могу его использовать.

load_idt:
mov edx, [esp + 4]
lidt [edx]
sti
ret

read_port:
mov edx, [esp + 4]
in al, dx   
ret

write_port:
mov edx, [esp + 4]    
mov al, [esp + 4 + 4]  
out dx, al  
ret

keyboard_handler:                 
call keyboard_handler
iretd

Я собираю boot.s с помощью следующей команды:

as --32 boot.s -o boot.o

Может кто-нибудь помочь мне перевестичасть клавиатуры (синтаксис Intel) для AT & T?:)

1 Ответ

0 голосов
/ 02 марта 2019

Информация о том, как вы можете преобразовать синтаксис NASM Intel в синтаксис AT & T GAS, содержится в этом ответе Stackoverflow , и много полезной информации предоставлено в этой статье IBM ,Ваш код, в частности, будет выглядеть так:

load_idt:
    mov 4(%esp), %edx
    lidt (%edx)
    sti
    ret

read_port:
    mov 4(%esp), %edx
    in %dx, %al
    ret

write_port:
    mov 4(%esp), %edx
    mov 8(%esp), %al
    out %al, %dx
    ret

keyboard_handler:                 
    call keyboard_handler
    iret

В целом самые большие различия:

  • С синтаксисом AT & T источник находится слева, а пункт назначения - справа, а Intelнаоборот.
  • С синтаксисом AT & T перед именами регистров добавляется %
  • С синтаксисом AT & T с непосредственными значениями добавляется $
  • Операнды памяти, вероятно,самая большая разница.NASM использует [сегмент: disp + base + index * scale] вместо синтаксиса GAS сегмент: disp (base, index, scale) .

Другие замечания

Я рекомендую переместить стек из секции мультизагрузки в секцию .bss.Раздел BSS, как правило, не занимает места в выходном исполняемом файле (при условии, что он использует стандартный или компоновочный скрипт по умолчанию).Стек можно определить таким образом после раздела .text:

.section .bss
    .lcomm stackBottom 512
stackTop:
...