Сборка: загрузчик для поддержки пользовательских клавиатур ОС
У меня есть работающая простая пользовательская ОС (пока что не очень много: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 ответ
Информацию о том, как вы можете перейти к переводу синтаксиса NASM Intel в синтаксис AT&T GAS, можно найти в этом ответе Stackru, а в этой статье IBM содержится много полезной информации. Ваш код в частности будет выглядеть так:
load_idt:
mov 4(%esp), %edx
lidt (%edx)
sti
ret
read_port:
mov 4(%esp), %edx
in %dx, %al
ret
write_port:
mov (%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: