使用 masm 编译程序集文件时表达式中缺少运算符

Missing operator in expression when compiling assembly file with masm

MASM 说 "missing operator in expression" 但我发现程序集没有问题。

我正在尝试在 x86 asm 中手动调用 windows 系统调用,我已经从 https://j00ru.vexillium.org/syscalls/nt/64/

中获取了 NtFlushInstructionCache 的系统调用偏移量。

C声明: extern "C" NTSTATUS NewNtFlushInstructionCache(HANDLE ProcessHandle, PVOID BaseAddress, ULONG NumberOfBytesToFlush);

这是我的汇编:

.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

这一行的错误是 "missing operator in expression":call large DWORD PTR fs:[0C0h] 有什么帮助吗? fs不能直接从assembly访问吗?

内存操作数的 LARGE 修饰符是 IDA/IDA Pro 反汇编程序的产物,MASM 无法理解。在 MASM 中,无需指定 LARGE:

即可完成
call DWORD PTR fs:[0C0h]

LARGE是内存模型,不是内存操作数的修饰符。

默认情况下 FSGS 设置为 ASSUME FS:error 因此当使用这些段寄存器时它们将产生一个 错误 A2183ASSUME FS:nothing 覆盖行为并允许您自由使用 FS。在使用 FS 之前的某个位置放置 ASSUME FS:nothing,如下所示:

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