Отсутствует оператор в выражении при компиляции файла сборки с помощью masm - PullRequest
1 голос
/ 28 мая 2019

MASM говорит "отсутствует оператор в выражении", но я не вижу проблем со сборкой.

Я пытаюсь вручную вызывать системные вызовы windows в x86 asm, я взял смещение системного вызова из fs дляNtFlushInstructionCache из https://j00ru.vexillium.org/syscalls/nt/64/

Объявление C: extern "C" NTSTATUS NewNtFlushInstructionCache(HANDLE ProcessHandle, PVOID BaseAddress, ULONG NumberOfBytesToFlush);

Вот мой asm:

.model flat
.486
.code

NewNtFlushInstructionCache PROC
    mov eax, 39h
    xor ecx, ecx
    lea edx, [esp + 4]
    call large DWORD PTR fs:[0C0h]
    add esp, 4
    ret 14h
NewNtFlushInstructionCache ENDP

END

Ошибка «отсутствует оператор в выражении» в этой строке: call large DWORD PTR fs:[0C0h] Любая помощь?Можно ли получить доступ к fs напрямую из сборки?

1 Ответ

3 голосов
/ 28 мая 2019

Модификатор LARGE для операнда памяти является артефактом дизассемблера IDA / IDA Pro и не понят MASM. В MASM это просто делается без указания LARGE:

call DWORD PTR fs:[0C0h]

LARGE - это модель памяти, а не модификатор для операндов памяти.

По умолчанию FS и GS установлены на ASSUME FS:error, поэтому при использовании этих сегментных регистров выдается Ошибка A2183 . ASSUME FS:nothing отменяет поведение и позволяет свободно использовать FS . Поместите ASSUME FS:nothing в какой-то момент перед использованием FS следующим образом:

ASSUME FS:nothing
call DWORD PTR fs:[0C0h]
...