Непонятная работа связки GCC и NASM (Откуда-то берётся 16-битная адресация)

Модератор: Модераторы разделов

ma}{im
Сообщения: 2

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

Сообщение ma}{im »

Эксперементирую с использованием NASM-овских функций в C++ коде и наткнулся на странную проблему. Компилю и запускаю программу (все исходники в конце поста):

Код: Выделить всё

$ nasm -g -f elf -o test_a.o test.asm
$ g++ -g test.cpp test_a.o -o test
$ ./test
Input two digits: 1 2
Segmentation fault (core dumped)

Стал разбираться - залез в gdb и увидел такую картину:

Код: Выделить всё

(gdb) disas summ
Dump of assembler code for function summ:
0x80485f0 <summ>:       push   %bp
0x80485f2 <summ+2>:     mov    %sp,%bp
0x80485f5 <summ+5>:     addr16 mov 8(%bp),%eax
0x80485f9 <summ+9>:     addr16 add 12(%bp),%eax
0x80485fd <summ+13>:    pop    %bp
0x80485ff <summ+15>:    ret
End of assembler dump.

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

test.cpp:

Код: Выделить всё

#include<stdio.h>

extern "C" int summ(int, int);

int main()
{
    int a, b, c;
    printf("Input two digits: ");
    scanf("%d%d",&a,&b);
    c = summ(a,b);
    printf("%d+%d=%d\n",a,b,c);
    return 0;
}

test.asm:

Код: Выделить всё

global summ:function

%define first  bp+08h
%define second bp+0Ch

summ:
    push bp
    mov  bp, sp

    mov  eax, [first]
    add  eax, [second]

    pop  bp
    ret
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

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

Сообщение flook »

Как варианты:
1. Писать esp и ebp замест sp и bp
2. Писать movl замест mov
Некоторые асмы особенно на второй вариант реагируют
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
ma}{im
Сообщения: 2

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

Сообщение ma}{im »

flook писал(а):
18.03.2006 09:25
1. Писать esp и ebp замест sp и bp

СПАСИБО огромное! Помогло! ;)
Спасибо сказали: