c - 混合程序(.asm + .cpp): modify small math program's code to include float input

标签 c assembly floating-point hybrid

(Intel x86。TASM 和 BorlandC 编译器,以及使用的 TLINK。)

main1.cpp 中,程序接受 int 输入(直到您输入小于 -999999 的数字),将其放入数组 x[],将输入的数量放入数组的第 0 个元素,将数组的指针发送到 f1.asm,将数字相加,然后将结果返回到 main1.cpp,因此可以显示。

如何修改它,使其包含 float 作为输入?

我的具体问题:

  1. 当我将 int 转换为 float 时,f1.asm 中输入偏移的位置会发生变化,但我不能找到它;

  2. .asm 中 float 的数学运算。

(我无法真正理解在其他地方找到的 .asm float 的解释。)

提前谢谢您。

ma​​in1.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 评论补充的示例。

ma​​in.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/

相关文章:

Python子进程实时stdout和stdin问题

c - 为什么union和inner struct要加padding?

math - OpenEdge abl truncate( log(4)/log(2) ) 应为 2 返回 1

c - C 中的 sin v/s sinf 函数

floating-point - 我应该如何解释 REAL 的 ASN.1 BER 标准?

c++ - 找不到 sdk\lib\library.lib

android - 如何将 C++ 源代码解析为 obj?

linux - nasm 系统调用 Linux

assembly - 缺少uop缓存的粒度

c - 有许多不同类型的堆栈