将参数从c ++传递到cout中的程序集

时间:2015-01-08 00:30:48

标签: c++ assembly nasm argument-passing

我正在编写c ++和nasm assembly atm的简单混合,并且不明白为什么结果在" cout"内外都不同。也许这是某种例外,但我想知道其中的差异。谢谢你的帮助。

C ++ PART

#include <iostream>
#include <cstring>
using namespace std;
extern "C" unsigned int quot (unsigned int, unsigned int);
extern "C" unsigned int remainder (unsigned int, unsigned int);

int main()
{
    unsigned int i=0, j=0, k=0;
    cout << "Numbers 'x y'" << endl;
    cin >> i >> j;
    k = quot(i,j);
    cout<< "Result: " <<k;
    k = remainder(i,j);
    cout <<" r. "<< k <<endl;

    cout << "Result: "<<quot(i,j)<<" r. "<<remainder(i,j)<<endl;

    return 0;
}

NASM “和提醒功能几乎相同。唯一的区别是在代码中注释

section .data

section .text
    global quot

quot:
    ; intro 
    push ebp         
    mov ebp,esp      

    xor edx, edx     
    mov eax, [ebp+8] 
    mov ebx,[ebp+12] 

    div ebx

    ; DIFFERENCE: in remainder we have additionaly
    ; mov eax, edx

    mov esp,ebp 
    pop ebp  
    ret      

结果 对于12 5输入,我们期望结果:2 r。 2但我们获得了。

Result: 2 r. 2
Result: 2 r. 5

1 个答案:

答案 0 :(得分:1)

您必须在asm函数中保留ebx的值(请参阅http://en.wikipedia.org/wiki/X86_calling_conventions#cdecl)。违反调用约定可能会导致各种错误,从细微到崩溃。

使用ecx代替ebx,或尝试div dword ptr [ebp+12]