Visual Studio编译内核驱动.asm文件报错,求助排查汇编代码问题
解决ARM架构内核驱动汇编代码的编译错误
兄弟,你这明显是踩了架构不兼容的坑!你写的是x86_64架构的汇编指令,但当前项目是针对ARM32编译的,armasm(ARM汇编器)根本识别不了x86的寄存器和指令语法,难怪编译报错。我帮你拆解问题并给出适配的代码:
核心错误点
- 寄存器不对味:
rsp、rax都是x86的专属寄存器,ARM32用sp当栈指针,通用寄存器是r0-r15;如果是ARM64则是sp和x0-x30。 - 立即数加载受限:ARM指令集没法直接用
mov加载0DEADBEEFCAFEBEEFh这么大的64位立即数——哪怕是ARM64,mov也只能加载特定范围的立即数,得用ldr伪指令拆分或者直接加载。 - 跳转指令不兼容:x86的
jmp rax在ARM里得换成bx r0(ARM32)或者br x0(ARM64)这类指令。
适配ARM32(Thumb2)的修正代码
如果你的项目目标是ARM32内核驱动,把代码改成这样:
.code32 DispatchHook proc ; 对应x86的add rsp,8h:ARM32栈是4字节对齐,调整栈指针 add sp, #8 ; 把64位立即数拆成两个32位值,加载到r0和r1 ldr r0, =0CAFEBEEFh ldr r1, =0DEADBEEFh ; 这里示例跳转到r0存储的地址,你可以根据实际需求调整 bx r0 DispatchHook endp end
适配ARM64的修正代码
如果目标是ARM64内核驱动,记得先把项目平台切换到ARM64(Visual Studio项目属性里可调整),编译时会自动调用armasm64.exe,代码改成:
.code64 DispatchHook proc ; 对应x86的add rsp,8h:ARM64栈要求16字节对齐,这里调整栈指针 add sp, #8 ; 用ldr伪指令直接加载64位立即数到x0 ldr x0, =0DEADBEEFCAFEBEEFh ; 跳转到x0指向的地址 br x0 DispatchHook endp end
额外提醒
- 一定要确认项目的目标架构:别在ARM32项目里写ARM64代码,反之亦然,Visual Studio的项目属性里可以切换平台。
- 内核驱动的汇编要严格遵守对应架构的调用约定和栈对齐要求,比如ARM64必须保证栈是16字节对齐,不然很容易触发系统崩溃。
内容的提问来源于stack exchange,提问作者Alex




