А что нельзя больше 32 бит положить по какому либо адресу? FASM. Код (Text): use64 mov qword [0], 13000000h И еще в руссиович писал, что текущая реализация адересации архитектур Windows x64 ограничена 48 битами, это начиная с XP исправлено?
Такая инструкция недопустима в 64битном режиме. Чтобы положить 64битное значение в память, надо сделать так: Код (Text): mov rax, 13000000h mov [0], rax Насчет 48битного ограничения -- это ограничение процессора. Насколько я помню, какие-то процессоры поддерживают 48битный физ. адрес, какие-то -- 52битный. Хотя, может, и ОС тоже ограничивает.
Именно эта инструкция должна правильно ассемблироваться, потому-что 13000000h в 32 бита умещаются. В fasm`e есть не большие проблемы с абсолютной аддрессацией, в крайнем случае можно rip`o-независимым опкодом попробовать db 48h,0c7h,04h,25h,00h,00h,00h,00h,00h,00h,00h,13h.
Так 1300000000h помещается, и спрашивал, почему больше 32 бит нельзя. А вот про 48 битное адресное ограничение интересно. Это только на уровне железа. На програмном уровне я могу всем адресным пространством оперировать?
Не совсем. Если, к примеру, процессор поддерживает только 48 бит линейного адреса (т.е. CPUID.80000008H.AH==48), из канонического адреса в eax после sar eax, 47 должно получиться 0 либо -1. Так что посреди 64-битного линейного адресного пространства — дыра (хотя если рассматривать адрес как величину со знаком, дыры нет, а ноль посередине . Обращение к памяти с неканоническим линейным адресом вызовет #GP/#SS. CPUID.80000008H.AL содержит разрядность физического адреса.
Если даже и фиолетово. Это еще не значит что такой инструкции нет. Даже в масме это почему-то не фиолетово. Код (Text): mov qword ptr [0],13000000h Ну и опкод смотри выше.
Может быть sysexit старой версией fasm`a пользуется. У меня версия 1.69.24. Кушает и не давится. Код (Text): use64 mov qword [0],13000000h Единственная проблема это то что он это дело к rip`у привязывает. И уже на таком коде артачится Код (Text): use64 org 200400000h mov qword [0],13000000h
Просто надо написать mov [qword 0x12345678], rax и будет абсолютный адрес. 64 битное значение помещаемое в память трактуется как 32 битное с знаком и при помещении значения знак расширяется. Таким образом диапазон значений получается от - 2 ^ 31 до 2 ^ 31. А знак будет расширен до 64 бит. Это ограничение amd64.