Непонятная работа связки GCC и NASM

Тема в разделе "WASM.UNIX", создана пользователем makcum, 18 мар 2006.

  1. makcum

    makcum New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2006
    Сообщения:
    2
    Адрес:
    Russia
    Эксперементирую с использованием NASM-овских функций в C++ коде и наткнулся на странную проблему. Компилю и запускаю программу (все исходники в конце поста):
    Код (Text):
    1. $ nasm -g -f elf -o test_a.o test.asm
    2. $ g++ -g test.cpp test_a.o -o test
    3. $ ./test
    4. Input two digits: 1 2
    5. Segmentation fault (core dumped)
    6.  


    Стал разбираться - залез в gdb и увидел такую картину:
    Код (Text):
    1. (gdb) disas summ
    2. Dump of assembler code for function summ:
    3. 0x80485f0 <summ>:       push   %bp
    4. 0x80485f2 <summ+2>:     mov    %sp,%bp
    5. 0x80485f5 <summ+5>:     addr16 mov 8(%bp),%eax
    6. 0x80485f9 <summ+9>:     addr16 add 12(%bp),%eax
    7. 0x80485fd <summ+13>:    pop    %bp
    8. 0x80485ff <summ+15>:    ret
    9. End of assembler dump.


    Я так понял, что Segmentation fault происходит из-за addr16, но откуда она взялась? В исходнике ничего подобного нет, <font color="red]КАК С ЭТИМ БОРОТЬСЯ????</font><!--color--> :o



    test.cpp:
    Код (Text):
    1. #include<stdio.h>
    2.  
    3. extern "C" int summ(int, int);
    4.  
    5. int main()
    6. {
    7.     int a, b, c;
    8.     printf("Input two digits: ");
    9.     scanf("%d%d",&a,&b);
    10.     c = summ(a,b);
    11.     printf("%d+%d=%d\n",a,b,c);
    12.     return 0;
    13. }


    test.asm:
    Код (Text):
    1. global summ:function
    2.  
    3. %define first  bp+08h
    4. %define second bp+0Ch
    5.  
    6. summ:
    7.     push bp
    8.     mov  bp, sp
    9.  
    10.     mov  eax, [first]
    11.     add  eax, [second]
    12.  
    13.     pop  bp
    14.     ret
     
  2. makcum

    makcum New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2006
    Сообщения:
    2
    Адрес:
    Russia
    esp и ebp вместо sp и bp - вот ключ к спасению!!!!