问题
(Intel x86. TASM and BorlandC compilers, and TLINK used.)
In main1.cpp the program takes int input (until you input a number smaller than -999999), puts it into an array x[], puts the number of inputs into array's 0th element, sends array's pointer to f1.asm, adds the numbers, and returns the result to main1.cpp so it can be displayed.
How to modify it so it will include floating-point numbers as input?
My specific problems:
The location of the input's offset in
f1.asmchanges when I turnintintofloat, and I can't find it ;Math operations on floats in
.asm.
(I couldn't really comprehend explanation on .asm floats I found elsewhere.)
Thank you in advance.
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
回答1:
An example as addition to the comments of 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
Build & run:
PATH <Path to BCC>\BIN;<Path to TASM>\BIN
BCC.EXE main.cpp f1.asm
main.exe
来源:https://stackoverflow.com/questions/30664788/hybrid-program-asm-cpp-modify-small-math-programs-code-to-include-float