MASM 说“表达式中缺少运算符”,但我认为程序集没有问题。
我正在尝试在 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
此行的错误是“表达式中缺少运算符”:call large DWORD PTR fs:[0C0h]
有什么帮助吗? fs不能直接从assembly访问吗?
最佳答案
内存操作数的 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]
关于c++ - 使用 masm 编译程序集文件时表达式中缺少运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56334337/