Обсуждение Руководства по ассемблеру MASM для архитектуры Intel x86-64

Тема в разделе "MASM", создана пользователем Dmitry_Milk, 29 окт 2026 в 17:55.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    607
    Чегой-то? Оно обозначает, что из памяти по адресу, где лежит переменная num, будет взято 4 байта, независимо от того, каого размера был определен num. То есть, если num там определялся как 8-битное значение (db/byte), то это вовсе незначит, что значение будет расширено до 4 байт нулями или знаковым битом, а лишь значит, что num будет взят с последующими тремя мусорными байтами.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.406
    Dmitry_Milk,
    пожалуйста, дождитесь окончания статьи, найденные ошибки и опечатки публикуйте в этом топике. Заранее, спасибо! :yes3:
     
    Последнее редактирование: 30 окт 2026 в 02:57
  3. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    226
    https://wasm.in/threads/rukovodstvo...tektury-intel-x86-64.36832/page-2#post-451483
    Если это руководство для новичков, тогда стоит заменить команду mov [rbx + 4], rdx на mov [rbx + 4], edx, чтобы не путать читателя несоответствием длин регистра и переменной.
     
    Mikl___ нравится это.
  4. R81...

    R81... Active Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    197
    Ну а комментарий-то? ; в память по адресу [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
     
    Последнее редактирование: 30 окт 2026 в 21:36
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    607
    В интеловском синтаксисе имена, объявленные через DB/DW..../DQ/BYTE, проще всего рассматривать как автоматически разадресующиеся указатели, если только явно не сказанно обратное (OFFSET/ADDR).

    Поэтому во всяких mov и прочих инструкциях, где идет обращение к данным по этим именам, автоматически подразумевается значение, лежащее в памяти, обозначенной этим именем.

    Для call это тоже работает.
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.406
    Всё! Закончил, теперь ругайте и указывайте на ошибки, недостатки и опечатки. По мере возможности буду исправлять :)
     
  7. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    226
    Добрый день. По мере свободного времени я начал читать все с самого начала. Думаю что времени будет на один пост в день. Так что вот что я нашел в #2 посте.
    Четырех.
    Что-то я упустил момент где EB стали эквивалентны байтам и как 16=264?
    NASM
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.406
    MaKsIm,
    спасибо, что откликнулись, нужно было скорее выложить, пока у меня есть время. Дальше будет вычитка, добавление нового материала, исправление ошибок. Многоуровневый уровень привилегий, первоначально задумывался как 4-х уровневый 00, 01, 10, 11. Но в Windows он выродился в 2 уровня, ядерный (00) и пользователя (11). Это связано с историей разработки системы, когда она создавалась для процессоров с двумя уровнями.
     
  9. MaKsIm

    MaKsIm Active Member

    Публикаций:
    0
    Регистрация:
    11 фев 2008
    Сообщения:
    226
    Тут я согласен. Но я спрашивал про другое. Там во втором месте. Как 16 EB = 264 байтам? А в первом случае там просто опечатка. Написано три вместо четырех для архитектуры, а не реализации в ОС.

    ADD: Все. Я увидел, что это 2 в 64 степени, а не 264
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.406
    MaKsIm,
    в любом случае спасибо, просто требуется вычитка, исправления, добавления. Работа над статьей ― это коллективное занятие... :friends:
     
  11. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    378
    Это не предел - сейчас есть ЦП с поддержкой 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):
    1. 0: kd> dt _kpcr fffff8000243a000
    2. ntdll!_KPCR
    3.    +0x000 NtTib        : _NT_TIB
    4.    +0x000 GdtBase      : 0xfffff800`02c03000  _KGDTENTRY64
    5.    +0x008 TssBase      : 0xfffff800`02c02000  _KTSS64  <-------------
    6.    +0x010 UserRsp      : 0
    7.    +0x018 Self         : 0xfffff800`0243a000  _KPCR
    8.    +0x020 CurrentPrcb  : 0xfffff800`0243a180  _KPRCB
    9.    +0x028 LockArray    : 0xfffff800`0243a7f0  _KSPIN_LOCK_QUEUE
    10.    +0x030 Used_Self    : 0x000007ff`fffd8000
    11.    +0x038 IdtBase      : 0xfffff800`02c01000  _KIDTENTRY64
    12. ......
    13.  
    14. 0: kd> dt 0xfffff800`02c02000 _KTSS64 -b -v
    15. ntdll!_KTSS64
    16. struct _KTSS64, 8 elements, 0x68 bytes
    17.    +0x000 Reserved0    : 0
    18.    +0x004 Rsp0         : 0xfffff800`02c04200
    19.    +0x00c Rsp1         : 0
    20.    +0x014 Rsp2         : 0
    21.    +0x01c Ist          : (8 elements)
    22.     [00] 0
    23.     [01] 0xfffff800`02c043e0
    24.     [02] 0xfffff800`02c045e0
    25.     [03] 0xfffff800`02c047e0
    26.     [04] 0xfffff800`02c049e0
    27.     [05] 0
    28.     [06] 0
    29.     [07] 0
    30.    +0x05c Reserved1    : 0
    31.    +0x064 Reserved2    : 0
    32.    +0x066 IoMapBase    : 0x68
    33. 0: kd>
    34.  
     
    Mikl___ нравится это.