Гибридная программа (.asm + .cpp): изменить код небольшой математической программы, чтобы включить ввод с плавающей запятой
(Компиляторы Intel x86. TASM и BorlandC, а также TLINK.)
В main1.cpp
программа занимает int
ввод (пока вы не введете число меньше -999999), помещает его в массив x[]
, помещает количество входов в 0-й элемент массива, отправляет указатель массива на f1.asm
, добавляет числа и возвращает результат main1.cpp
так что это может быть отображено.
Как изменить его так, чтобы он включал числа с плавающей точкой в качестве входных данных?
Мои конкретные проблемы:
Расположение смещения входа в
f1.asm
меняется, когда я поворачиваюint
вfloat
и я не могу его найти;Математические операции на плавает в
.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