Что не так
/AT командной строки: Enables tiny-memory-model support.
Enables error messages for code constructs
that violate the requirements for .com format files.как и почему это работало тогда, а вот в досбоксе неработает?
Написал такой код, меняет местами только первые 8 символов, а дальше не знаю как продолжить.
fild и fistpLeneax и esi внутри цикла      этот кусочек я нашла с клавиатурой но к сожалению не работате:
; инициализация библиотеки Turbo Graphics MOV AH, 00h INT 10h
; завершение работы с графикой MOV AH, 00h INT 10h
TARGET_WORD DB 'World', '$'
CMP TARGET_WORD[BX], 0
JE FOUND
LEA DI, TARGET_STRING
ADD DI, BX
CMP AL, 0
JE AFTER_MAKE_SPACE
STOSB
LEA DI, INSERT_WORD
LODSB
MOV AH, 0
INSERT_WORD_LOOP:
STOSB
в идеале дайте исправленый код
; устанавливаем сегмент стека mov ax, s_seg mov ss, ax ; устанавливаем сегмент данных mov ax, d_seg mov ds, ax
пишет segment relocate
ax то s_seg, то d_seg как константы, откуда он их возьмёт без релокаций? Если хочешь com-файл, то либо пиши вместо этого mov ax, cs ; mov ds, ax, либо вообще этот код выкинь, потому что com-файл и так стартует со всеми сегментами указывающими в одно и то же место.      В risc вроде там куча csr регистров
на разных компиляторах одна си операция ассемблируется то в комбинацию lui + addi, то в комбинацию auipc +addi
lui и auipc. Такие инструкции есть у RISC-V.lui загружает константу собранную из 20 битов непосредственного значения из инструкции и 12 нулевых младших битов в целевой регистр, а auipc прибавляет такую же точно константу к PC и загружает в целевой регистр результат сложения, и в этом вся разница между ними.где какая используется не совсем понимаю.
lui используется для генерации констант, которые не зависят от того, где расположен код, а auipc для генерации констант, которые двигаются вместе с кодом. Т.е. Если ты хочешь вызвать функцию, которая находится дальше чем ±2К от точки вызова, ты можешь сгенерировать её адрес инструкцией auipc, и полученный код будет работать одинаково, независимо от того, по какому адресу он будет размещён. А если тебе надо поместить в регистр константу, например 0x12345678, то ты можешь это сделать парой инструкций lui rd, 0x12345 ; addi rd, rd, 0x678 и значение константы будет всегда одинаковым, вне зависимости от того, где будет этот код.Каким образом одинаковые адреса различаются. Или они просто не могут быть одинаковыми(типа ос позаботиться)?
Как они в tlb обрабатываются, если вдруг они реально могут быть одинаковыми, и там нету ни каких дополнительных индексов процесса)
TTBR с примерно той же функцией, что и cr3 в x86.satp, содержащий ASID и базовый адрес корневого каталога страничных таблиц. Об этом можно прочитать в разделе 4.1.12 Supervisor Address Translation and Protection (satp) Register спецификации The RISC-V Instruction Set Manual Volume II: Privi....      Почему нужно 512-356 байт нулями заполнять, почему нельзя продолжить дальше. Ведь следующая после 86*4 байт инструкция(или переменная) будет выровнена
.p2align, то у тебя таких вопросов не было бы. Потому что никто не заполняет 512-356 байт после. .p21lign выравнивает текущий адрес по заданной степени двойки. Обычно для этого есть аппаратные причины, например базовый регистр таблицы векторов прерываний может иметь 9 младших бит зафиксированных в 0. Или вот по границе страницы MMU выравнивают данные в ELF-файлах, чтобы можно было установить отдельно разрешения RX для кода и констант и RW для изменяемых данных.для получения элемента допустим table[index_nBit] можно применять операцию ИЛИ вместо сложения. Что быстрее. В этом ли дело
почему просто 20 бит не берется по порядку
By rotating bits in the instruction encoding of B and J immediates instead of using dynamic hard-
ware muxes to multiply the immediate by 2, we reduce instruction signal fanout and immediate
mux costs by around a factor of 2
для кого авторы постарались придумать такую ерунду
Почему компиляторы не используют инструкции повторения REP movs?
Она должна быть в миллиард раз быстрее
при этапе компоновки и линковки ml.exe /c /coff program.asm
link.exe /subsystem:windows program.obj выдаёт ошибку - This program cannot be run in DOS mode.
call GetWindowReact
…
call GetWindowsDC
GetWindowRect и GetWindowDC.сделать так чтобы изображение окружности было вписано в квадрат
Как увеличить FPS в системе?
Основной способ стандартный -- не перерисовывать всё, если можно этого избежать.
VIDEO_BUFFER_SEGMENT = 0xA000
VIDEO_BUFFER_OFFSET = 0xFA00
VIDEO_SEGMENT = 0xA000
VIDEO_OFFSET = 0x0000
diff --git a/lib/video.inc b/lib/video.inc
index 3a26f43e2f79..d7054e194da9 100644
--- a/lib/video.inc
+++ b/lib/video.inc
@@ -3,8 +3,8 @@ VIDEO_INC equ 0
 
 include "memory.inc"
 
-VIDEO_BUFFER_SEGMENT = 0xA000
-VIDEO_BUFFER_OFFSET = 0xFA00
+VIDEO_BUFFER_SEGMENT = 0x6000
+VIDEO_BUFFER_OFFSET = 0x0000
 VIDEO_SEGMENT = 0xA000
 VIDEO_OFFSET = 0x0000
 VIDEO_SIZE_DB = 0xFA00
@@ -79,11 +79,11 @@ macro video!flip {
        mov ax, VIDEO_SEGMENT
        mov bx, VIDEO_BUFFER_SEGMENT
        mov es, ax
-       mov ds, ax
+       mov ds, bx
        mov cx, VIDEO_SIZE_DB
        cld
        mov si, VIDEO_BUFFER_OFFSET
-       xor di, VIDEO_OFFSET
+       mov di, VIDEO_OFFSET
        rep movsb
        pop ds es
 }
diff --git a/os.asm b/os.asm
index 1949e95b4e99..e5ebb3d280aa 100644
--- a/os.asm
+++ b/os.asm
@@ -91,9 +91,9 @@ kernel.routine.startup:
 kernel.routine.video:
        cli
        video!fill 0x4E
-       ;video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
-       ;video!cursor
-       ;video!flip
+       video!window 30, 40, 100, 60, 0x1A, 0xFF, 13 , 0x1F
+       video!cursor
+       video!flip
        sti
        retmov al, [bp+12] mov bl, al mov cl, 3 shl al, cl sbb dh, dh cbw mov dl, [bp+8] mov al, [bp+10]
kernel.routine.mouse.init:
  push es bx
  int 0x11
  test ax, 4
  jz kernel.routine.mouse.init.error
  mov ax, 0xC205
  mov bh, 3
  int 0x15
  jc kernel.routine.mouse.init.error
  mov ax, 0xC203
  mov bh, MOUSE_RESOLUTION
  int 0x15
  jc kernel.routine.mouse.init.errorЧто не так с процедурой?
stdcall test_proc, 11 … proc test_proc, ms … mov rbx, qword ptr ms
403004:       48 c7 c1 0b 00 00 00    mov    $0xb,%rcx
40300b:       e8 19 00 00 00          callq  0x403029
…
40307b:       48 8b 5d 10             mov    0x10(%rbp),%rbxцифра три на левой части дисплея имеет код 9Е и чтобы вывести результат сложения 1 + 2 мне надо 3 как-то преобразовать в 9Е
0xfa, 0x0a, 0xb6, 0x9e, 0x4e, 0xdc, 0xfc, 0x8a, 0xfe, 0xde