Загрузчик нормально работает при загрузке 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. start:
....
mov sp, start + 512 + 1024
org 0x7c00
start:
mov ax, 0
mov ss, ax
mov sp, start + 512 + 1024
mov ax, 0x060 ;(1024+512)/16=96=60h адрес стека после загрузчика в сегментах mov ss, ax ;установка адреса сегмента стека mov sp, 1024 ;установка указателя стека
add ax, 0x060 ;адрес стека после загрузчика в сегментах 0x07C0+0x060
На ассемблере в программе есть раздел .text, .bss, .data
при компиляции в машинный код там тоже так на сегменты разбит
для выполнения процессором
mul al,5
idiv cx,4
sar cx, 2
mov al,x cmp al,a jg sled1 mov bl,a ...
как сделать разветвление от условия, если это условие не удовлетворяет.
jg sled1
не совершает перехода и ты просто выполняешь следующую за ней инструкцию -- mov bl, a
. Ветвления и переходы в твоём коде выглядят правильно. RSP: 0x00007FFFFFFFEA78
) указывает примерно в то же место, где находится код программы (0x7fffffffea75: push rbx
). Код обычно защищён от записи, соответственно записать в стек может быть нельзя по этой причине. Кроме того, если записать в стек таки можно, push rbx как раз перепишет саму себя и следующую инструкцию. Без отладчика это может работать за счёт конвейера, но под отладчиком это работать не будет. Правильный ли ход мыслей?
только проблема в том, что в gcc формат ассемблерных вставок другой
int main() {
int a = 1;
int b = 3;
int c;
asm (
"mov %[a], %[c]\n\t"
"add %[b], %[c]\n\t"
: [c] "=mr" (c)
: [a] "mr" (a), [b] "mr" (b));
printf("a + b = %x + %x = %x\n", a, b, c);
}