Гибридная программа (.asm + .cpp): изменить код небольшой математической программы, чтобы включить ввод с плавающей запятой

(Компиляторы Intel x86. TASM и BorlandC, а также TLINK.)

В main1.cpp программа занимает int ввод (пока вы не введете число меньше -999999), помещает его в массив x[], помещает количество входов в 0-й элемент массива, отправляет указатель массива на f1.asm, добавляет числа и возвращает результат main1.cpp так что это может быть отображено.

Как изменить его так, чтобы он включал числа с плавающей точкой в ​​качестве входных данных?

Мои конкретные проблемы:

  1. Расположение смещения входа в f1.asm меняется, когда я поворачиваю int в floatи я не могу его найти;

  2. Математические операции на плавает в .asm,

(Я не мог понять объяснение .asm плавает я нашел в другом месте.)

Заранее спасибо.

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 ответ

Решение

Пример как дополнение к комментариям Росса Риджа.

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
Другие вопросы по тегам