【问题标题】:ASM compiling with C, and the return value into C from ASMASM用C编译,从ASM返回值到C
【发布时间】:2013-04-20 12:27:40
【问题描述】:

我正在从头开始学习使用编程来学习 asm,但我找不到任何关于我当前问题的帮助。

所以我制作了 3 个文件(2 个在 asm 中,1 个在 c 中)。

我希望我的 C 文件能够打印其他 2 个程序的输出。 C中的文件:

iclude <stdio.h>

float a = 1;
float b = 2;
float c = 3;

extern float asm1 (float a, float b, float c);
extern float asm2 (float a, float b, float c);


int main ()
{

float count1= 0;
float count2= 0;

count1= asm1 (a, b, c);
count2= asm2 (a, b, c);

printf("Output : %f and %f \n", count1, count2);

return 0;
}

ASM 中的文件几乎相同,文件编号 1 产生 x1,文件编号 2 产生 x2。文件编号 1 使每个变量都以 1 结尾(例如 a1,x1),而 asm 中的文件编号 2 以 2 结尾(例如 a2,x2)。

.align 32
.data

a1: .float 0
b1: .float 0
c1: .float 0
buf1: .float 0
x1: .float 0

four1: .float 4
two1: .float 2

.text
.global asm1

asm1:

xor %eax, %eax
xor %ebx, %ebx
xor %ecx, %ecx

pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ecx
movl 12(%ebp), %ebx
movl 16(%ebp), %eax
pushl %eax
pushl %ebx
pushl %ecx

movl %eax, c1
movl %ebx, b1
movl %ecx, a1

finit 
fld a1
fld c1

**more code**

fstp x1

movl %ebp, %esp
popl %ebp
ret

我希望这个文件有 x1(x2) 作为返回值,它将显示在 printf 的 C 文件中。而不是这个,我得到-nan。我该怎么做?

【问题讨论】:

    标签: assembly floating-point x86


    【解决方案1】:

    要从函数返回浮点值,您需要将返回值留在 FPU 堆栈中。

    这样

     addf ...
     ; leave the value one the FPU stack, don't fstp
    

    【讨论】:

    • 我将 fstp x1 更改为 addf x1,并得到错误“没有这样的指令”。我正在使用 ubuntu 32b。 @edit 如果您的意思是 faddp 正在添加一些东西,现在我不知道是什么以及为什么。
    • 你能说得清楚一点吗?我应该在哪里更改它(什么代码部分?)?
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 2022-01-15
    • 2011-09-04
    • 2017-01-05
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多