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

Проблемы арифметики на ассемблере?

Доброго времени суток, делаю урезанный компилятор для паскаля, но вот столкнулся с проблемой, дело в том, что при вроде очевидных вещах, ассемблер ведет себя не очевидно. Транслирую a:=2-3+4; эту запись в ассемблер предварительно получив обратную польскую запись вида: 2 3 - 4 +. Сам в ассемблере новичок и его повадки мне не знакомы. В итоге выполнения выражения получаю 2 Прилагаю генерируемый код:
.data
a:
	.long 0
printf_format:
	.string "%d\n"

.text
.global main
main:
	movl $0, %eax
	movl $0, %edx
	movl $2, %edx
	sub $3, %edx
	addl %edx, %eax // Здесь должно быть -1 в eax

	movl $0, %edx
	movl %eax, %edx
	addl $4, %edx
	addl %edx, %eax // Здесь 3 в eax

	movl %eax, a


	pushl a
	pushl $printf_format
	call  printf
	addl  $8, %esp

	ret


Сам генератор написан так:
string outStr = "";
    vector<Token *> poliz;
    stack<string> arStack;
    root->next[1]->Log();
    root->next[1]->ReverseNodes(poliz);

    arStack.push(poliz[0]->value);
    arStack.push(poliz[1]->value);

    AddLine("\tmovl $0, %eax");

    for(int it = 2; it < poliz.size(); it++)
    {
        if(poliz[it]->value == "+" || poliz[it]->value == "-" ||
           poliz[it]->value == "*" || poliz[it]->value == "/")
        {
            string op1 = arStack.top();
            arStack.pop();
            string op2 = arStack.top();
            arStack.pop();
            string op = "";

            if(op1 != "%eax")
                op1 = "$" + op1;

            if(op2 != "%eax")
                op2 = "$" + op2;

            AddLine("\tmovl $0, %edx");

            if(poliz[it]->value == "+")
                op = "\taddl ";
            if(poliz[it]->value == "-")
                op = "\tsub ";

            AddLine("\tmovl " + op2 + ", %edx");
            AddLine(op + op1 + ", %edx");
            AddLine("\taddl %edx, %eax");
            AddLine("");
            arStack.push("%eax");
        }
        else
            arStack.push(poliz[it]->value);
    }

    AddLine("\tmovl %eax, " + root->next[0]->data.token->value);
    AddLine("\n");
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
Вы не обнуляете %eax (в нём остаётся значение -1, к которому Вы прибавляете 3, вот и получается 2)

P. S. printf_format должно быть "%ld\n", потому что тип переменной long, а не int.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@frilix Автор вопроса
Иногда "творю"
Спасибо
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы