Доброго времени суток, делаю урезанный компилятор для паскаля, но вот столкнулся с проблемой, дело в том, что при вроде очевидных вещах, ассемблер ведет себя не очевидно. Транслирую
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");