как и почему это работало тогда, а вот в досбоксе неработает?
Написал такой код, меняет местами только первые 8 символов, а дальше не знаю как продолжить.
fild
и fistp
Len
eax
и 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
ret
mov 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
. Зачем он для такой строчки на 69, 70ой строчке добавляет к j такую странную константу.
-fdump-tree-all
(фиг знает, как сделать это на godbolt.org, я проверял локально), то уже в самом первом дампе можно увидеть, что if (arr[j - 1] > arr[j])
превращается в это:if (*(arr + ((sizetype) j + 1073741823) * 4) > *(arr + (sizetype) ((unsigned int) j * 4)))
j + 1073741823
превратилось в add r3, r3, #1073741824
subs r3, r3, #1
j + 1073741824 - 1
. После умножения на 4 старшие два бита j теряются, но в чём смысл использования 30-битной -1 вместо 32-битной -- мне непонятно.sub r3, r3, #1
. Ещё интересно, что даже с -O2
эта константа остаётся в сгенерированном коде, а исчезает только с -Os
. Выглядит как регрессия.