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吗?
答案 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]