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 невозможно из защищённого режима в котором я и "сижу".
Как тогда войти в виртуальный режим?
Загрузчик нормально работает при загрузке 1 сектора
$ nasm test.s -o test
$ head -c 2b /dev/urandom >> test
$ hexdump -Cv test | tail -n2
000005f0 49 93 ad 56 25 97 25 82 61 1d d9 a1 66 2a cb 19 |I..V%.%.a...f*..|
00000600
$ qemu-system-i386 -hda test -gdb tcp::1235 -S
$ wget https://gist.githubusercontent.com/MatanShahar/1441433e19637cf1bb46b1aa38a90815/raw/2687fb5daf60cf6aa8435efc8450d89f1ccf2205/target.xml
$ gdb
(gdb) set tdesc filename target.xml
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB. Attempting to continue with the default i8086 settings.
(gdb) target remote :1235
(gdb) set disassembly-flavor intel
(gdb) b *0x7c32
Breakpoint 2 at 0x7c32
(gdb) c
Continuing.
Breakpoint 2, 0x00007c32 in ?? ()
(gdb) x/2i $pc
=> 0x7c32: int 0x13
0x7c34: jb 0x7c3e
(gdb) tb *0x7c34
Temporary breakpoint 3 at 0x7c34
(gdb) c
Continuing.
Temporary breakpoint 3, 0x00007c34 in ?? ()
(gdb) x/16x 0x13f0
0x13f0: 0x49 0x93 0xad 0x56 0x25 0x97 0x25 0x82
0x13f8: 0x61 0x1d 0xd9 0xa1 0x66 0x2a 0xcb 0x19
mov dl, 80h
для выбора первого ЖД, для определённости. Почему не обнуляется регистр cx?
A1:
push ax
push cx
push dx
push di
xor cx, cx
mov di, 10
mov cx, [bx+2]
A1:
push ax
push cx
push dx
push di
xor cx, cx
mov di, 10
mov cl, [bx+1]
firstNum db 6,0,6 dup(?)
.A2:
xor dx, dx
mov dx, [bx+si]
sub dx, '0'
add ax, dx
.A2:
xor dx, dx
mov dl, [bx+si]
sub dl, '0'
add ax, dx
A1:
push ax
push cx
push dx
push di
...
pop si
pop di
И К примеру выполняется такие команды, как пример инструкция чтения строки из stdin, почему вся ос не глохнет. Типа что в этот момент ожидания времени происходит, Или что ОС все 1000 потоков переключает там каждую 0.0001 секунды?
А если принять к факту, что по умолчанию в регистрах хранится значение 0x00
я попробовал ничего не записывать в регистр AH и вызвать прерывание 0x16, значит по умолчанию в регистре 0x00.
в подпрограмме read_keyboard почему то не сохраняют регистр AX
почему сохранили регистр BX - я не понял
как процессор может отличить длину команды (1, 2, и 3 байт), чтобы выполнить следующую команду ?
Почему кроме команды Остановить все команды занимают 3 байта?
Как происходить выборка команды? Как найти логическую схему выборки команды?
Как реализовать на с или assembler асинхронную выборку из RAM?
memcpy
для MIPS. Этот код не выглядит асинхронным, но написан именно так (сначала групповая загрузка в разные регистры, потом изменение базового адреса загрузки, потом групповое сохранение, потом изменение базового адреса сохранения) с рассчётом на то, что процессор сможет, в том числе, перекрыть во времени операции загрузки, арифметики и сохранения данных. 00000234: xori r16,r16,32768 00000238: addi r16,r16,-32768
Подскажите пожалуйста смысл таких преобразований?
short right = acum & 65535;
. Оно нужно для того, чтобы работать с загруженными в регистры значениями не задумываясь об исходной ширине их типа данных. Т.е. (short)-1
в 64-битном регистре будет представлен как 0xffffffffffffffff, а не как 0xffff.