You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MASM x64(ml64.exe)汇编语法疑问:函数参数未遵循Windows x64 ABI?

Windows x64汇编函数参数不符合ABI的问题

我需要将GNU内联汇编编写的函数移植到MS VC 2022 x64(cl.exe)的C语言项目中,由于目标指令ltr没有对应的内部函数,我将该函数放在独立的.asm文件中,使用以下命令汇编:

ml64.exe /c /nologo /Zi /Fo"asm.obj" /Ta"asm.asm"

我用proc指令定义了接收单个参数sel的函数set_tr,汇编代码如下:

public set_tr

.code

; void set_tr(u16 sel)
set_tr PROC sel:WORD
    ltr sel
    ret
set_tr ENDP

end

生成的目标文件反汇编显示,函数从栈中读取参数:

Dump of file asm.obj

File Type: COFF OBJECT

set_tr:
  0000000000000000: 55                           push        rbp
  0000000000000001: 48 8B EC                     mov         rbp,rsp
  0000000000000004: 0F 00 5D 10                  ltr         word ptr [rbp+10h]
  0000000000000008: C9                           leave
  0000000000000009: C3                           ret

  Summary

           0 .data
         254 .debug$S
          20 .debug$T
           A .text$mn

但这和Windows x64 ABI规则矛盾——首个非向量参数应该通过RCX寄存器传递,而且调用方C代码的反汇编显示参数确实是放入ECX后才调用set_tr的:

0000000000000472: 0F B7 8D B8 01 00 00               movzx       ecx,word ptr [rbp+1B8h]
0000000000000479: E8 00 00 00 00                     call        set_tr

请问我在汇编语法上哪里出错了?


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 21:14:51