2013-03-18 2 views
1

Привет ребята Я пытаюсь построить следующую функциюx86 простая функция не работает

function int Main(){ 
return 5; 
} 

это мой код сборки:

.globl Main 
Main: 
pushl %ebp 
movl %esp, %ebp 
subl $0, %esp 
pushl $5 
movl %ebp, %esp 
popl %ebp 
ret 

Однако это всегда возвращает 1 никогда не возвращает 5 почему?

+0

_Suggestion: _ почему вы не используете компилятор для генерации кода сборки. Например, [GCC] (http://www.delorie.com/djgpp/v2faq/faq8_20.html)? –

+0

@JacobSeleznev Я на самом деле пытаюсь создать простой компилятор для класса, поэтому я пытаюсь сгенерировать код сборки. Я не понимаю, что не так с кодом сборки, который я сгенерировал –

ответ

3

Как насчет:

Main: 
push byte 5 
pop eax 
ret 
+0

Я хочу его с прологом и эпилогом, потому что я использую функцию C++ для генерации этого кода, и я хочу иметь возможность использовать функцию C++ для генерации нескольких функций в x86 –

+3

При взаимодействии с другими языками возвращаемое значение ожидается в 'eax', как это делает Мартин. – Gunner

0

Подводя итог, что все говорят: ваш основной ошибкой является то, что возвращаемое значение должно идти в EAX, и это не делает. Пролог и код epilog не нужны для таких простых функций, как это, но они также не повредят (пока они не разбалансируют стек). Поэтому сборка должна идти:

(prolog) 
movl $5, %eax, 
(epilog) 
ret 

Где пролог и эпилог - это то, что ваш компилятор генерирует по умолчанию.

Смежные вопросы