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

标签 c++ assembly visual-c++ x86 masm

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 是一种内存模型,而不是内存操作数的修饰符。

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

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

关于c++ - 使用 masm 编译程序集文件时表达式中缺少运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56334337/

相关文章:

c++ - 如何知道两个 c++ 断点之间的代码汇编行的大小?

c++ - 使用 constexpr initializer_list 构造函数时 MSVC 无法编译

c++命名空间问题

c++ - 将 QBuffer 用于二进制数据

c - 将表指针从 C 传递到汇编函数

assembly - ARM 汇编中的程序计数器

C++:在多个文件中定义类

c++ - 用于组合容器和自定义逻辑的 C++ 技术/库?

visual-studio - 根据VC++编译器版本条件编译

python - 错误 "Microsoft Visual C++ 14.0 is required (Unable to find vcvarsall.bat)"