混合程序(.asm + .cpp):修改小数学程序的代码以包含浮点输入

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

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

如何修改它以包含浮点数作为输入?

我的具体问题:

  1. 当我将int转换为float ,输入在f1.asm的偏移量的f1.asm发生变化,而我找不到它;

  2. .asm浮点数的数学运算。

(我无法理解我在其他地方找到的.asm花车的解释。)

先感谢您。

main1.cpp:

 #include  #include  #include  extern "C" int f1( int* x ); int main() { int x[100], i ; for( i = 1 ; x[i-1]>=-999999 ; i++ ) { cout << "x[" << i <> 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 

一个例子,作为罗斯里奇评论的补充。

main.cpp中:

 #include  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 \BIN;\BIN BCC.EXE main.cpp f1.asm main.exe