x64 Ассемблер (MASM)
От: roman313  
Дата: 09.11.10 09:10
Оценка:
Hi !

В 32-битном режиме я могу сделать так:

.data

SuperAddress dd 0

.code

super proc
... код
super endp


Main proc
mov eax, offset SuperAddress
mov [eax], offset super
...
— все компилируется и работает OK.


Но в 64-битном режиме выдает ошибку Invalid Instruction Operand:

.data

SuperAddress dq 0

.code

super proc
... код
super endp


Main proc
mov rax, offset SuperAddress
mov [rax], offset super


...
— не компилируется,
могу сделать через регистры, но нежелательно.
В чем в этой строке ошибка:

mov [rax], offset super
???
Re: x64 Ассемблер (MASM)
От: Сергей Мухин Россия  
Дата: 09.11.10 09:33
Оценка:
Здравствуйте, roman313, Вы писали:

R>Hi !


R>В 32-битном режиме я могу сделать так:


R>.data


R>SuperAddress dd 0


R>.code


R>super proc

R>... код
R>super endp

Вот такой плохой AMD, не придумал такой команды. mov r64, imm64 есть, а mov [r64], imm64 нет

см:
ntel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A:
Instruction Set Reference, A-M
---
С уважением,
Сергей Мухин
Re[2]: x64 Ассемблер (MASM)
От: roman313  
Дата: 09.11.10 11:31
Оценка:
- но FASM все нормально компилирует,
и в дизассемблере получается код вида

mov [rax], адрес нужной функции

Так что непонятно, почему





Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, roman313, Вы писали:


R>>Hi !


R>>В 32-битном режиме я могу сделать так:


R>>.data


R>>SuperAddress dd 0


R>>.code


R>>super proc

R>>... код
R>>super endp

СМ>Вот такой плохой AMD, не придумал такой команды. mov r64, imm64 есть, а mov [r64], imm64 нет


СМ>см:

СМ>ntel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A:
СМ>Instruction Set Reference, A-M
Re[3]: x64 Ассемблер (MASM)
От: Сергей Мухин Россия  
Дата: 09.11.10 11:32
Оценка:
Здравствуйте, roman313, Вы писали:

R>- но FASM все нормально компилирует,

R>и в дизассемблере получается код вида

R>mov [rax], адрес нужной функции


R>Так что непонятно, почему


Покажи коды команд.
---
С уважением,
Сергей Мухин
Re[4]: x64 Ассемблер (MASM)
От: roman313  
Дата: 09.11.10 15:01
Оценка:
Да пожалуйста:

64-битная программа, скомпилированная FASM:

код команды: 48c7c000204000 mov rax, offset ячейка памяти
код команда: 48c700b3114000 mov qword ptr [rax], offset адрес некоей функции

FASM эту конструкцию нормально прогоняет, и программа работает.
Да и в 64-битном режиме все правильно с точки зренияч синтаксиса,
думаю, что это баг MASM

mov qword ptr [rax], offset xxx — все должно работать, но в MASM не проглатывает.
он проглатывает только так:

mov rcx, offset xxx
mov [rax], rcx — тогда OK




Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, roman313, Вы писали:


R>>- но FASM все нормально компилирует,

R>>и в дизассемблере получается код вида

R>>mov [rax], адрес нужной функции


R>>Так что непонятно, почему


СМ>Покажи коды команд.
Re[5]: x64 Ассемблер (MASM)
От: Сергей Мухин Россия  
Дата: 09.11.10 17:16
Оценка:
Здравствуйте, roman313, Вы писали:

R>Да пожалуйста:


R>64-битная программа, скомпилированная FASM:


R>код команды: 48c7c000204000 mov rax, offset ячейка памяти

R>код команда: 48c700b3114000 mov qword ptr [rax], offset адрес некоей функции

R>FASM эту конструкцию нормально прогоняет, и программа работает.

R>Да и в 64-битном режиме все правильно с точки зренияч синтаксиса,
R>думаю, что это баг MASM

спасибо. я посмотрю внимательней завтра. А вот в каком порядке описаны super proc и Main proc?
---
С уважением,
Сергей Мухин
Re[6]: x64 Ассемблер (MASM)
От: roman313  
Дата: 09.11.10 17:25
Оценка:
Тут немного модификация —
R>>код команды: 48c7c000204000 mov rax, offset ячейка памяти в секции дата (адрес больше WinMain)
R>>код команда: 48c700b3114000 mov qword ptr [rax], offset адрес некоей функции — секция кода, адрес чуть больше WinMain





Здравствуйте, Сергей Мухин, Вы писали:

СМ>Здравствуйте, roman313, Вы писали:


R>>Да пожалуйста:


R>>64-битная программа, скомпилированная FASM:


R>>код команды: 48c7c000204000 mov rax, offset ячейка памяти

R>>код команда: 48c700b3114000 mov qword ptr [rax], offset адрес некоей функции

R>>FASM эту конструкцию нормально прогоняет, и программа работает.

R>>Да и в 64-битном режиме все правильно с точки зренияч синтаксиса,
R>>думаю, что это баг MASM

СМ>спасибо. я посмотрю внимательней завтра. А вот в каком порядке описаны super proc и Main proc?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.