Какую систему команд выбрать? …
для демонстрации принципов работы ассемблера
Скажите, машинный код команды будет один и тот же, или различный?
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 дней */
что значит код
ubfx r0, r0, #1, #1
-- извлечь битовое поле шириной 1 бит (правая единица) начиная с бита №1 (левая единица) из регистра r0 (правый r0) и поместить результат в r0 (левый r0).bx lr
-- перейти по адресу в регистре lr, обычно это возврат из подпрограммы.какая между ними разница
ubfx r0, r0, #1, #1
ubfx r0, r0, #2, #1
что я делаю не так
Вот, что я попытался сделать:
push word 0 pop es mov bx, 0x11*2+0xF000 mov word [es:bx], int10-$$
Я пытался гуглить, всю ночь потратил, …
проблема в отсутствии информации
В микропроцессорах Intel 8086/80186 таблица векторов прерываний расположена в первом килобайте памяти начиная с адреса 0000:0000 и содержит 256 векторов прерываний в формате сегмент:смещение.
boot:
push word 0
pop es
mov bx, 0x11*4
mov word [es:bx + 2], cs
mov word [es:bx], int10
откуда прерывания знают адрес, куда им вернуть результат.
Прерывание в коде int 21h и прочие Это какое?
int
-- программное. В отличие от прерывания, инициируемого уровнем или фронтом сигнала подключённого к контроллеру прерываний.выполнение прерывания std::cin>>line; Может и сутки длиться.
std::cin >>line
в конце концов превращается в системный вызов read
.Вот как по пунктам для этой команды. (С условием что есть еще 1 поток жаждущий ЦП).
cat /proc/<PID>/stack
и увидеть следующую картину:[<0>] wait_woken+0x67/0x80
[<0>] n_tty_read+0x426/0x5a0
[<0>] tty_read+0x135/0x240
[<0>] new_sync_read+0x115/0x1a0
[<0>] vfs_read+0xf4/0x180
[<0>] ksys_read+0x5f/0xe0
[<0>] do_syscall_64+0x33/0x80
[<0>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
Как происходит доступ к эл. массива на уровне ядра?
Например массив Int* arr = new int[1024*1024*1024] он как храниться?
А физическая, для массива то же? Ведь, так будет доступ намного быстрее?
получается эмулятор каждый адрес вычислять что ли?
На виндовс, icore 5 процессоре вот сейчас, какой тип памяти работает. И какой тип виртуальной памяти на Risc 5 архитектурах.
Вот запускается программа. Что происходит. Типа создается процесс, в MMU в таблице страниц генерируется номер страницы PID>>24 + 0x4000000h адрес примерно. И заноситься в таблицу (https://ru.bmstu.wiki/MMU_(Memory_Management_Unit) ) Создаются типа страницы для данных. Окей
PID>>24 + 0x4000000h
, это вообще что?как программа вообще может в такой системе вызвать функцию из внешней библиотеки
Что за таблица дескрипторов. Где она находиться.
Как связана с таблицей страниц?
Что в конечном итоге храниться TLB буфере????
gcc
вызванный с флагом -fomit-frame-pointer
генерирует код без этой последовательности и использует rbp как ещё один регистр общего назначения.Почему тогда все регистры не помещаются в стек?
почему вычитается 32?
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movsd %xmm0, -24(%rbp)
movsd %xmm1, -32(%rbp)
movsd -32(%rbp), %xmm0
subsd -24(%rbp), %xmm0
movsd %xmm0, -8(%rbp)
movsd .LC0(%rip), %xmm0
divsd -8(%rbp), %xmm0
movsd %xmm0, -16(%rbp)
relocation R_X86_64_32S against `.text' can not be used when making a shared object
что делать?
objdump -dr lib.o
27: 0f 01 1c 25 00 00 00 lidt 0x0
2e: 00
2b: R_X86_64_32S .text
lea rax, [rel idtDescriptor]
lidt [rax]
dq _idt