2016-02-18 8 views
1

Я делаю программу в сборке для чтения диска через порты (0x1f0-0x1f7), и я смешиваю его с c. У меня есть функция в сборке, которую я назову в своем основном funtion. Моя главная функция, как 1 параметров: секторам следующим образом:Смешивание C и сборка

Kernel.c

extern int _readd(int nmrsector); 
(...) 
int sector = 257; 
int error = _readd(sector); 
if(error == 0) PrintString("Error"); //It is declared on my screen.h file 

disk.asm

global _readd 

_readd: 
push eax 
push ebx 
push ecx 
push edx 
push ebp 

mov ebp, esp 
mov eax, [ebp+8] 
mov ecx, eax 
cmp ecx, 256 
jg short _fail 
jne short _good 

_fail: 
xor eax, eax 
leave 
ret 

_good: 
xor eax, eax 
mov eax, 12 
leave 
ret 

Это происходит сбой при запуске его с VirtualBox. Есть идеи?

+1

* Как * вы запускаете его в VirtualBox? Возможно, вы захотите попробовать его с помощью [QEMU] (http://wiki.qemu.org/Main_Page), у которого есть крючки, которые позволяют использовать отладчик. –

+2

Правильно использовать фреймы стека. Прочитайте, как работают «ENTER» и «LEAVE». После вашего «оставления» у вас все еще есть все, что нужно сделать в стеке. – ElderBug

+0

Я всплыл все, и он всегда возвращает мне ошибку. Когда я меняю свой сектор на 25, он должен возвращать int, отличное от 0, но он возвращает 0. Что я делаю неправильно? – C00LD0WN

ответ

2

Если вы сохраняете регистры процессора при вводе функции, вам необходимо восстановить их, когда вы закончите. Ваш PUSH s должен соответствовать POP s.

Кроме того, если вы используете фрейм стека для доступа к локальным переменным и параметрам, настройте кадр (push ebp ; mov ebp, esp) перед всем, чтобы вы могли более легко обращаться к ним. Здесь [ebp+8] не относится к параметру, потому что вы изменяете стек перед настройкой фрейма.

+0

. Вы также не должны использовать 'enter'. – Ven

+1

@Ven Почему нет? OP ** ** использовал фрейм стека, поэтому я объясню, как это сделать правильно. Тот факт, что вы можете делать все без рамки стека, не имеет значения. – ElderBug

+0

Нет, это не то, о чем я говорю. [см. это] (http://stackoverflow.com/a/26323663/1737909) – Ven

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