@frilix
Иногда "творю"

Ошибка сегментирования?

Доброго времени суток, пишу генератор кода, но столкнулся с проблемой, дело в том, что при выполнении нижележащего кода возникает ошибка сегментирования.
print1:
	.string "%d\n"
.data
a:
	.long 0
.text
.global main
main:
	movl $-8, %ecx
	movl $-7, %edx
	cmp %ecx, %edx
	setg %ah
	push %ax
	pushl a
	pushl $print1
	call printf
	addl $8, %esp

	jmp label_01
label_00:

label_01:

	ret


И второй момент, я хочу добавить арифметику в условные выражения, то есть что-то типа: 7 + 5 > 6 + 2 для арифметических выражений использую стек, но проблема в том, что и для вычисления условных выражений используется стек. Возможно как-то разделить стек на части? В смысле обращаться к одной части для вычисления арифметических выражений, а к другой части для вычисления условных выражений ?

Третий момент, как можно реализовать работу с вещественными числами на ассемблере, и есть ли для таких дел соответствующие регистры ?

P.S Код ассемблера генерируется автоматически, так что я знаю, что его можно было бы уменьшить, но пока это не основная моя проблема
  • Вопрос задан
  • 301 просмотр
Решения вопроса 1
@nirvimel
Первый момент: То, что где-то возникает ошибка сегментирования - само по себе не говорит ни о чем. Так код не анализируется (и тем более, генераторы так не пишутся). Нужно под отладчиком рассматривать эту ошибку детально: в каком месте, откуда шел вызов, что там со стеком, что с указателями. и.т.д.

Второй момент: Обратную польскую нотацию удобно вычислять прямо на вершине стека (но гораздо быстрее все же на регистрах, пока регистров хватает). Для всего остального выделяются локальные переменные в стековом фрейме, например (но все же и тут следует максимально задействовать регистры).

Третий момент: Что такое сопроцессор. Далее по ссылкам.

P.S.: Почему не LLVM? Зачем еще один велосипед?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы