Чегой-то? Оно обозначает, что из памяти по адресу, где лежит переменная num, будет взято 4 байта, независимо от того, каого размера был определен num. То есть, если num там определялся как 8-битное значение (db/byte), то это вовсе незначит, что значение будет расширено до 4 байт нулями или знаковым битом, а лишь значит, что num будет взят с последующими тремя мусорными байтами.
Dmitry_Milk, пожалуйста, дождитесь окончания статьи, найденные ошибки и опечатки публикуйте в этом топике. Заранее, спасибо!
https://wasm.in/threads/rukovodstvo...tektury-intel-x86-64.36832/page-2#post-451483 Если это руководство для новичков, тогда стоит заменить команду mov [rbx + 4], rdx на mov [rbx + 4], edx, чтобы не путать читателя несоответствием длин регистра и переменной.
Ну а комментарий-то? ; в память по адресу [RBX + 4] , т.е. в n2 помещаем значение из eDx. И к тому же, по моему мнению при Mov [RBX+4], RDX обнулится DW [RBX + 8] - что вообще некорректно. P.S. Если что я еще не дошел до x64. --- Сообщение объединено, 30 окт 2026 в 23:03 --- Да не "выгрести" все ошибки из статьи, если все откладывать. Код (ASM): .data ptrToSum qword offset sum ; указатель содержит адрес процедуры sum .code sum proc mov rax, rcx add rax, rdx ret sum endp main proc mov rcx, 22 mov rdx, 25 ;call ptrToSum ; ошибка ? если MASM-64 не безумно умный call [ptrToSum] ; вызываем процедуру через указатель ret main endp end Код (ASM): lea rax, sum mov ptrToSum, rax Ну раз уж выше указано на offset, то как альтернативный вариант? Код (ASM): mov ptrToSum, offset sum
В интеловском синтаксисе имена, объявленные через DB/DW..../DQ/BYTE, проще всего рассматривать как автоматически разадресующиеся указатели, если только явно не сказанно обратное (OFFSET/ADDR). Поэтому во всяких mov и прочих инструкциях, где идет обращение к данным по этим именам, автоматически подразумевается значение, лежащее в памяти, обозначенной этим именем. Для call это тоже работает.
Всё! Закончил, теперь ругайте и указывайте на ошибки, недостатки и опечатки. По мере возможности буду исправлять
Добрый день. По мере свободного времени я начал читать все с самого начала. Думаю что времени будет на один пост в день. Так что вот что я нашел в #2 посте. Четырех. Что-то я упустил момент где EB стали эквивалентны байтам и как 16=264? NASM
MaKsIm, спасибо, что откликнулись, нужно было скорее выложить, пока у меня есть время. Дальше будет вычитка, добавление нового материала, исправление ошибок. Многоуровневый уровень привилегий, первоначально задумывался как 4-х уровневый 00, 01, 10, 11. Но в Windows он выродился в 2 уровня, ядерный (00) и пользователя (11). Это связано с историей разработки системы, когда она создавалась для процессоров с двумя уровнями.
Тут я согласен. Но я спрашивал про другое. Там во втором месте. Как 16 EB = 264 байтам? А в первом случае там просто опечатка. Написано три вместо четырех для архитектуры, а не реализации в ОС. ADD: Все. Я увидел, что это 2 в 64 степени, а не 264
MaKsIm, в любом случае спасибо, просто требуется вычитка, исправления, добавления. Работа над статьей ― это коллективное занятие...
Это не предел - сейчас есть ЦП с поддержкой 57-битного вирт.адреса (128 ПБ), через таблицы PML5. https://grokipedia.com/page/Intel_5-level_paging#adoption-and-support Да, используются только Ring(0:3), но почему-то 1:2 до сих пор держат в резерве - видимо планируют что-то новое. Например в сегменте TSS-32 было три поля Rsp0,1,2 для стеков соответствующих уровней, плюс в хвосте имелась огромная карта IoMap для режима V86. Сейчас в TSS-64 убрали эту карту вместе с V86, добавили новый массив резервных стеков IST, а вот поля Rsp1,2 всё-же оставили. Зачем? Даже древние гипервизоры с паравиртуализацией их в то время не использовали, не говоря уже об аппаратном VT-x. Код (Text): 0: kd> dt _kpcr fffff8000243a000 ntdll!_KPCR +0x000 NtTib : _NT_TIB +0x000 GdtBase : 0xfffff800`02c03000 _KGDTENTRY64 +0x008 TssBase : 0xfffff800`02c02000 _KTSS64 <------------- +0x010 UserRsp : 0 +0x018 Self : 0xfffff800`0243a000 _KPCR +0x020 CurrentPrcb : 0xfffff800`0243a180 _KPRCB +0x028 LockArray : 0xfffff800`0243a7f0 _KSPIN_LOCK_QUEUE +0x030 Used_Self : 0x000007ff`fffd8000 +0x038 IdtBase : 0xfffff800`02c01000 _KIDTENTRY64 ...... 0: kd> dt 0xfffff800`02c02000 _KTSS64 -b -v ntdll!_KTSS64 struct _KTSS64, 8 elements, 0x68 bytes +0x000 Reserved0 : 0 +0x004 Rsp0 : 0xfffff800`02c04200 +0x00c Rsp1 : 0 +0x014 Rsp2 : 0 +0x01c Ist : (8 elements) [00] 0 [01] 0xfffff800`02c043e0 [02] 0xfffff800`02c045e0 [03] 0xfffff800`02c047e0 [04] 0xfffff800`02c049e0 [05] 0 [06] 0 [07] 0 +0x05c Reserved1 : 0 +0x064 Reserved2 : 0 +0x066 IoMapBase : 0x68 0: kd>