我在程序集中执行程序以通过端口(0x1f0-0x1f7)读取磁盘,并且我将它与c混合。我有一个汇编功能,我将在我的主要功能中调用。我的主要功能为1个参数:读取扇区:
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运行时崩溃。有什么想法吗?
答案 0 :(得分:2)
如果在输入功能时保存CPU寄存器,则需要在完成后恢复它们。您的PUSH
需要与POP
匹配。
此外,如果您使用堆栈帧来访问局部变量和参数,请在所有内容之前设置框架(push ebp ; mov ebp, esp
),以便您可以更轻松地引用它们。这里[ebp+8]
没有引用参数,因为你在设置框架之前改变了堆栈。