从汇编函数向C返回double值时出现段错误的问题求助
从汇编函数向C返回double值时出现段错误的问题求助
嘿,我来帮你揪出这个段错误的元凶!你遇到的问题跟返回值半毛钱关系都没有,完全是参数传递的理解错了😆
先给你点透问题所在:在x86-64的System V调用约定(Linux、macOS这些系统用的都是这个)里,浮点类型的参数(比如double)是直接通过XMM寄存器传递的,根本不是存在rdi、rsi这些通用寄存器指向的内存里!你现在的汇编代码里写movsd xmm0, [rdi],相当于去读rdi寄存器里存的地址对应的内存内容——但rdi里根本不是有效的内存地址啊!第一个double参数本来就直接存在xmm0里了,你这属于瞎访问无效内存,可不就触发段错误了嘛!
再说说你纠结的返回值问题:其实你完全想多了,System V约定里,返回64位的浮点类型(比如double)就是用xmm0寄存器的低64位,完全符合要求,根本不需要动rax寄存器,C那边会自动从xmm0里取返回值的。
给你改好的汇编代码,直接用就行:
section .text global dev dev: ; 第一个double参数已经在xmm0,第二个在xmm1,不需要从内存加载 subsd xmm0, xmm1 ; 直接做减法,结果存在xmm0里 ret
再补个小常识帮你避坑:整数类型的参数才会用rdi、rsi这些通用寄存器依次传递;而float、double这类浮点参数,是用xmm0到xmm7这8个XMM寄存器依次传递的,前8个浮点参数直接存在这些寄存器里,不用去内存里读。
备注:内容来源于stack exchange,提问作者Xantium
相关产品推荐
相关产品推荐

