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
相关产品推荐
相关产品推荐

