выдает непонятную фигню
res resb 1
…
mov [res], eax
more than one input file specified
nasm -felf64 bin BootLoader.asm -o BootLoader.bin
-felf64
и замени его на -fbin
.message
у тебя лежит перед кодом, в той же секции, хороший bin из этого не получится. Что нужно написать, чтобы загрузчик ос передавал управление коду в втором секторе?
почему-то не работает прерывание 0х20 для клавиатуры
я на винде только лог qemu могу просматривать
Я гуглил, но понятного объяснения не нашел.
Я пишу новую операционную систему и столкнулся с непредвиденным поведением ядра
проблема в файле kernel\kernel.asm
0x00008122: bb 00 81 movw $0x8100, %bx
0x00008125: 50 pushw %ax
0x00008126: b8 00 00 movw $0, %ax
0x00008129: 8e c0 movw %ax, %es
0x0000812b: 58 popw %ax
0x0000812c: cd 13 int $0x13
0x0000812e: 00 00 addb %al, (%bx, %si)
0x00008130: 00 00 addb %al, (%bx, %si)
0x00008132: 00 00 addb %al, (%bx, %si)
0x00008134: 00 00 addb %al, (%bx, %si)
0x00008136: 00 00 addb %al, (%bx, %si)
0x00008138: 00 00 addb %al, (%bx, %si)
0x0000813a: 00 00 addb %al, (%bx, %si)
0x0000813c: 00 00 addb %al, (%bx, %si)
0x0000813e: 00 00 addb %al, (%bx, %si)
0x00008140: 00 00 addb %al, (%bx, %si)
0x00008142: 00 00 addb %al, (%bx, %si)
0x00008144: 00 00 addb %al, (%bx, %si)
qemu-system-i386 -hda collector.bin -d in_asm,exec,cpu -D log
Как из файла ассемблера (NASM) запустить exe-шник?
Не отдельно, а как-будто ассемблерский файл это и есть ос?
А в чем заключаются эти ошибки, я не могу понять
"push edi"
"push esi"
"mov edx,lenS"
...
как их исправить
Предполагаю как-то через ExpandEnvironmentString.
Но не могу разобраться.
При достижении или больше определённого количества переменных или функций, перестают работать все string literals в ядре C
mov bx, KERNEL_OFFSET ; Read from disk and store in 0x1000
mov dh, 54 ;31 or 54
как можно увеличить память для них?
Моя программа … выводит адрес на месте первого числа и букву на месте второго числа.
как исправить?
"%d %d"
.push razmer
чтобы передать адрес переменной razmer в scanf, но в printf нужно передать не адрес переменной, а её значение. Например так:mov eax, [razmer]
push eax
Почему не получается деление div на ассемблере в С++?
char b1 = 3, b2, b3 = 1 , res2; //1 байт el, bl, ah ]] cbw -> short short w1= 1000, w2 = 500, w3 = 2; //(w1 - w2) * w3 / b1
div bl
во-первых компилятор даёт предупреждение, … , но ошибки не производит. Я спокойно линкую файл недо-драйвера с основным ядром, (конечный результат - .efi),
objdump -t bootx64.so | grep UND
0000000000000000 *UND* 0000000000000000 inportb
Trace 0: 0x7fb15d338e80 [0000000000000000/000000007e6e22de/0x40c2b0]
----------------
IN:
0x7e6e2081: bf 60 00 00 00 movl $0x60, %edi
0x7e6e2086: b8 00 00 00 00 movl $0, %eax
0x7e6e208b: e8 90 57 00 00 callq 0x7e6e7820
Trace 0: 0x7fb15d3390c0 [0000000000000000/000000007e6e2081/0x40c2b0]
----------------
IN:
0x7e6e7820: af scasl (%rdi), %eax
0x7e6e7821: af scasl (%rdi), %eax
0x7e6e7822: af scasl (%rdi), %eax
0x7e6e7823: af scasl (%rdi), %eax
0x7e6e7824: af scasl (%rdi), %eax
0x7e6e7825: af scasl (%rdi), %eax
0x7e6e7826: af scasl (%rdi), %eax
0x7e6e7827: af scasl (%rdi), %eax
0x7e6e7828: af scasl (%rdi), %eax
0x7e6e7829: af scasl (%rdi), %eax
0x7e6e782a: af scasl (%rdi), %eax
0x7e6e782b: af scasl (%rdi), %eax
…
unsigned char
inportb(unsigned short port)
{
unsigned char v;
asm volatile ("in {%1|%b0}, {%b0|%1}\n" : "=a"(v) : "d"(port));
return v;
}
-zdefs
в команду линковки чтобы получать ошибку линковки при наличии ссылок на неопределённые символы.-monitor stdio
). Я нажимаю ESC когда в QEMU запускается tianocore и выбираю Boot Manager -> EFI Internal Shell, а там пишу fs0:efi\boot\bootx64.efi
, после этого в мониторной консоли включаю логгирование (командами logfile log
, log in_asm,exec
), после чего нажимаю enter в консоли EFI. После этого можно смотреть в файл log и искать в нём знакомые байты из objdump. не могу понять как это записать, потому что у меня при двух условиях приходится добавлять к элементу массива две единицы, если введено число
надо сравнить если символ не входит в диапазон 31h-39h, то надо идти дальше по элементу массива
metka:
mov ax,0
mov al, StringT[si]
sub al, 49
jl next # перейти к следующей цифре, если код текущей меньше '1'
cmp al, 9
jnl next # перейти к следующей цифре, если текущая больше 9
mov bl, al
shl bl, 1 ;умножение на 2, т.к. размер адреса - 2 байта
xor ax, ax
mov dx, offset List[bx]
mov ah, 09h
int 21h
next:
add si, 1
loop metka
Почему пятый вариант не выполняется в 4 раза быстрее, чем первый?