А в чем заключаются эти ошибки, я не могу понять
"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 раза быстрее, чем первый?
MaxSymb Db 9
RealSymb Db ?
StringT db 1 dup (' ')
StringT db 9 dup (' ')
, иначе ввод затрёт то что там дальше в памяти лежит.я пытался и делать так mov cx, InBuff[0] , mov cx, InBuff[1] без разницы.
mov cl, [RealSymb]
len equ $ - StringT - не выходит, тоже 1 выдаёт
Как в nasm можно выполнить смещение?
[string + cx]
invalid effective address
Правильно ли я понимаю, что после того как биос загрузил загрузчик в память, тот в свою очередь должен посекторно считывать диск и загружать считанное в память.
Есть ли у регистров адреса как у памяти?
Почему нет?
компилятор ругается что
mov esi, CPUInfo
mov eax, InfoType
undefined
getCpuID PROC PUBLIC, CPUInfo, InfoType
.На OSDev Wiki прочитал что работать с pci невозможно из защищённого режима в котором я и "сижу".
Как тогда войти в виртуальный режим?