You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Visual Studio编译内核驱动.asm文件报错,求助排查汇编代码问题

解决ARM架构内核驱动汇编代码的编译错误

兄弟,你这明显是踩了架构不兼容的坑!你写的是x86_64架构的汇编指令,但当前项目是针对ARM32编译的,armasm(ARM汇编器)根本识别不了x86的寄存器和指令语法,难怪编译报错。我帮你拆解问题并给出适配的代码:

核心错误点

  • 寄存器不对味rsprax都是x86的专属寄存器,ARM32用sp当栈指针,通用寄存器是r0-r15;如果是ARM64则是spx0-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

额外提醒

  1. 一定要确认项目的目标架构:别在ARM32项目里写ARM64代码,反之亦然,Visual Studio的项目属性里可以切换平台。
  2. 内核驱动的汇编要严格遵守对应架构的调用约定和栈对齐要求,比如ARM64必须保证栈是16字节对齐,不然很容易触发系统崩溃。

内容的提问来源于stack exchange,提问作者Alex

火山引擎 最新活动