Ассемблер x64

Тема в разделе "WASM.ASSEMBLER", создана пользователем sysexit, 10 окт 2010.

  1. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    А что нельзя больше 32 бит положить по какому либо адресу? FASM.

    Код (Text):
    1. use64
    2.  
    3. mov qword [0], 13000000h
    И еще в руссиович писал, что текущая реализация адересации архитектур Windows x64 ограничена 48 битами, это начиная с XP исправлено?
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Такая инструкция недопустима в 64битном режиме. Чтобы положить 64битное значение в память, надо сделать так:

    Код (Text):
    1. mov rax, 13000000h
    2. mov [0], rax
    Насчет 48битного ограничения -- это ограничение процессора. Насколько я помню, какие-то процессоры поддерживают 48битный физ. адрес, какие-то -- 52битный. Хотя, может, и ОС тоже ограничивает.
     
  3. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Именно эта инструкция должна правильно ассемблироваться, потому-что 13000000h в 32 бита умещаются. В fasm`e есть не большие проблемы с абсолютной аддрессацией, в крайнем случае можно rip`o-независимым опкодом попробовать db 48h,0c7h,04h,25h,00h,00h,00h,00h,00h,00h,00h,13h.
     
  4. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Так 1300000000h помещается, и спрашивал, почему больше 32 бит нельзя.

    А вот про 48 битное адресное ограничение интересно. Это только на уровне железа. На програмном уровне я могу всем адресным пространством оперировать?
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Не должна. Он qword явно указал, и во что там умещается константа транслятору фиолетово.
     
  6. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Не совсем. Если, к примеру, процессор поддерживает только 48 бит линейного адреса (т.е. CPUID.80000008H.AH==48), из канонического адреса в eax после sar eax, 47 должно получиться 0 либо -1. Так что посреди 64-битного линейного адресного пространства — дыра (хотя если рассматривать адрес как величину со знаком, дыры нет, а ноль посередине :derisive:. Обращение к памяти с неканоническим линейным адресом вызовет #GP/#SS.

    CPUID.80000008H.AL содержит разрядность физического адреса.
     
  7. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Если даже и фиолетово. Это еще не значит что такой инструкции нет.

    Даже в масме это почему-то не фиолетово.
    Код (Text):
    1. mov qword ptr [0],13000000h
    Ну и опкод смотри выше.
     
  8. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Может быть sysexit старой версией fasm`a пользуется.
    У меня версия 1.69.24. Кушает и не давится.
    Код (Text):
    1. use64
    2. mov qword [0],13000000h
    Единственная проблема это то что он это дело к rip`у привязывает.

    И уже на таком коде артачится
    Код (Text):
    1. use64
    2. org 200400000h
    3. mov qword [0],13000000h
     
  9. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Я где-то писал что у меня не компилируется?

     
  10. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    sysexit
    Вспоминай.
    Я верю, у тебя получится:)
     
  11. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Извиняюсь.
    Что-то я не туда посмотрел.
     
  12. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Просто надо написать mov [qword 0x12345678], rax и будет абсолютный адрес.
    64 битное значение помещаемое в память трактуется как 32 битное с знаком и при помещении значения знак расширяется. Таким образом диапазон значений получается от - 2 ^ 31 до 2 ^ 31. А знак будет расширен до 64 бит. Это ограничение amd64.