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

时间:2019-05-28 02:38:24

标签: c++ assembly x86 masm

MASM说“表达式中缺少运算符”,但我认为程序集没有问题。

我正在尝试在x86 asm中手动调用Windows syscall,我已经从https://j00ru.vexillium.org/syscalls/nt/64/抓取了fs的NtFlushInstructionCache的syscall偏移量

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 个答案:

答案 0 :(得分:3)

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

call DWORD PTR fs:[0C0h]

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

默认情况下, FS GS 设置为ASSUME FS:error,因此当使用这些段寄存器时,它们将产生错误A2183 ASSUME FS:nothing会覆盖该行为,并允许您自由使用 FS 。像这样使用 FS 之前,请将ASSUME FS:nothing放在某个位置:

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