使用 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
是内存模型,不是内存操作数的修饰符。
默认情况下 FS 和 GS 设置为 ASSUME FS:error
因此当使用这些段寄存器时它们将产生一个 错误 A2183。 ASSUME FS:nothing
覆盖行为并允许您自由使用 FS。在使用 FS 之前的某个位置放置 ASSUME FS:nothing
,如下所示:
ASSUME FS:nothing
call DWORD PTR fs:[0C0h]
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
是内存模型,不是内存操作数的修饰符。
默认情况下 FS 和 GS 设置为 ASSUME FS:error
因此当使用这些段寄存器时它们将产生一个 错误 A2183。 ASSUME FS:nothing
覆盖行为并允许您自由使用 FS。在使用 FS 之前的某个位置放置 ASSUME FS:nothing
,如下所示:
ASSUME FS:nothing
call DWORD PTR fs:[0C0h]