Эксперементирую с использованием 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
Ответ на:
комментарий
от idle
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум стек. перезапись адреса возврата (2006)
- Форум GDB и NASM (2012)
- Форум NASM, GDB, LD (2012)
- Форум Проблема с Hello World на асме (2020)
- Форум Nasm, условия перехода (2015)
- Форум ругань на 16-битный код в ассмеблере (2011)
- Форум nasm + shared libraries (2007)
- Форум Вопрос про ptrace/SIGTRAP (2004)
- Форум Боль, безысходность, работа с ассемблером из под 64х разрядной системы. (2015)
- Форум Вызов ассемблерной функции с аргументами в стеке (2015)