LINUX.ORG.RU

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


0

0

Эксперементирую с использованием 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, но откуда она взялась? В исходнике ничего подобного нет, КАК С ЭТИМ БОРОТЬСЯ????

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

;------------------------------

anonymous
Ответ на: комментарий от anonymous

И, возможно, еще понадобится BITS 32 в начале файла.

smartly ★★★
()

> В исходнике ничего подобного нет

а это: %define first bp+08h ?

вы все время используете 16-ти разрядные регистры.

s/bp/ebp/, s/sp/esp/, я думаю.

idle ★★★★★
()
Ответ на: комментарий от idle

Давненько не писал на ассемблере. Непомню NASM какого синтаксиса придерживается: интеловского или AT&T?

Если AT&T, то следует помнить, что он отличается от интеловского, в частности в нём команда mov eax,[first] пересылает содержимое eax в [first], а не наоборот, как видно задумано.

anonymous_incognito ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.