Почему компиляторы не используют инструкции повторения 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
. Выглядит как регрессия. Какую систему команд выбрать? …
для демонстрации принципов работы ассемблера
Скажите, машинный код команды будет один и тот же, или различный?
mov x86
в гугле: https://c9x.me/x86/html/file_module_x86_id_176.html /Fl
, а деталями листинга можно управлять ключами /S*
, см.проблема в том что надо не через линк а через link16 тогда работает,
Написал простую программу, которая висит, ожидая нажатие клавиши, но она не висит, а вылетает
format PE console … push str1 call [printf] mov ah, 7 int 21h
Моя программа запускается в bosh но не реагирует на прерывания клавиш
keyboard_loop:
mov ah, 0
int 16h
mov ah, 0Eh
int 10h
jmp puts_loop
iso образ созданный dd не запускается в VB
mkisofs --no-emul-boot -o test.iso -b test.bin .
где test.bin
-- это твой бинарник бут-сектора.а загрузочная флешка не отображается в BIOS
откуда появился результат после сложения?
что это за значение 88 13 00 00 ......... и Val = 5000 ?
Как выучить язык ассемблера?
Посоветуйте какие-нибудь ресурсы по изучению
Как мне найти возраст файла?
3 * 24 * 60 * 60 * 10000000
100-наносекундных интервала (в таких единицах измеряется FILETIME).invoke GetFileTime, hFile, addr ftCreate, NULL, NULL
invoke GetSystemTimeAsFileTime, addr ftNow
mov eax, ftNow.dwHighDateTime
sub eax, ftCreate.dwHighDateTime
cmp eax, (3 * 24 * 60 * 60 * 10000000 / 0x100000000)
jg <файл старше 3 дней>
/* иначе файл младше 3 дней */
mov eax, ftNow.dwHighDateTime
sub eax, ftCreate.dwHighDateTime
cmp eax, (3 * 24 * 60 * 60 * 10000000 / 0x100000000)
jg <файл старше 3 дней>
jl <файл младще 3 дней>
mov eax, ftNow.dwLowDateTime
sub eax, ftCreate.dwLowDateTime
cmp eax, (3 * 24 * 60 * 60 * 10000000 % 0x100000000)
jg <файл старше 3 дней>
/* иначе файл младше 3 дней */