Hybrid program (.asm + .cpp): modify small math program's code to include float input

与世无争的帅哥 提交于 2019-12-11 03:09:39

问题


(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:

  1. The location of the input's offset in f1.asm changes when I turn int into float, and I can't find it ;

  2. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!