(Intel x86。TASM 和 BorlandC 编译器,以及使用的 TLINK。)
在 main1.cpp
中,程序接受 int
输入(直到您输入小于 -999999 的数字),将其放入数组 x[]
,将输入的数量放入数组的第 0 个元素,将数组的指针发送到 f1.asm
,将数字相加,然后将结果返回到 main1.cpp
,因此可以显示。
如何修改它,使其包含 float 作为输入?
我的具体问题:
当我将
int
转换为float
时,f1.asm
中输入偏移的位置会发生变化,但我不能找到它;.asm
中 float 的数学运算。
(我无法真正理解在其他地方找到的 .asm
float 的解释。)
提前谢谢您。
main1.cpp:
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
extern "C" int f1( int* x );
int main()
{
int x[100], i ;
for( i = 1 ; x[i-1]>=-999999 ; i++ )
{
cout << "x[" << i << "] = " ;
cin >> x[i] ; // Input elements while they're >= -999999
}
x[0] = i-1 ; // 0th array element gets the number of inputed elements
cout<<"\nSum of inputs = " << f1(x) ;
return 0;
}
f1.asm:
.model SMALL, C
.data
.code
PUBLIC f1
f1 PROC
push BP
mov BP,SP ; SP contains input from the c++ function
mov ax,[bp+4] ; get the address of the array
mov bp, ax ; BP now points to the array's 0th element
; (which is the the number of the to-be-added c++ inputs)
mov di, 0
mov ax, 0
mov cx, [bp] ; number of unputs gets stored in cx
dec cx
add bp, 2 ; Move bp to point at the next number -- the first c++ input
loop1:
mov bx, [bp]
add ax, bx ; add the input to the growing pile
add bp, 2 ; move the offset to point to the next input
inc di ; increase the Additions Counter
cmp di, cx ; if you add up all of the c++ inputs, exit loop
jne loop1
pop BP
ret
f1 ENDP
.stack
db 100(?)
END
最佳答案
作为 Ross Ridge 评论补充的示例。
main.cpp:
#include <iostream.h>
extern "C" {
int f1( int* );
float f2( float* );
}
int main()
{
int x1[100] = {5,3,4,5,6};
float x2[100] = {5,3.0,4.0,5.0,6.5};
cout << "Sum of x1 = " << f1(x1) << endl;
cout << "Sum of x2 = " << f2(x2) << endl;
return 0;
}
f1.asm:
.model SMALL, C
LOCALS @@
PUBLIC f1, f2
.code
f1 PROC
push BP
mov BP,SP ; SP contains input from the c++ function
mov ax,[bp+4] ; get the address of the array
mov bp, ax ; BP now points to the array's 0th element
; (which is the the number of the to-be-added c++ inputs)
mov di, 0
mov ax, 0
mov cx, [bp] ; number of unputs gets stored in cx
dec cx
add bp, 2 ; Move bp to point at the next number -- the first c++ input
@@loop1:
mov bx, [bp]
add ax, bx ; add the input to the growing pile
add bp, 2 ; move the offset to point to the next input
inc di ; increase the Additions Counter
cmp di, cx ; if you add up all of the c++ inputs, exit loop
jne @@loop1
pop BP
ret
f1 ENDP
f2 PROC
push bp
mov bp, sp
sub sp, 2 ; Space for a local temporary variable
mov bx,[bp+4] ; Get the address of the array into BX
; (BP is used otherwise)
fld dword ptr ss:[bx] ; Load the first float
fistp word ptr [bp-2] ; and store it as int
mov cx, [bp-2] ; Length of array
dec cx
mov di, 0
fldz ; Load null into ST0
add bx, 4 ; Move bx to point to the next float
@@loop1:
fadd dword ptr ss:[bx] ; ST0 = ST0 + [BX]
add bx, 4 ; move the offset to point to the next input
inc di ; increase the Additions Counter
cmp di, cx ; if you add up all of the c++ inputs, exit loop
jne @@loop1
mov sp, bp
pop bp
ret ; Return value in ST0
f2 ENDP
END
构建并运行:
PATH <Path to BCC>\BIN;<Path to TASM>\BIN
BCC.EXE main.cpp f1.asm
main.exe
关于c - 混合程序(.asm + .cpp): modify small math program's code to include float input,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30664788/