混合C和组装

时间:2016-02-18 09:55:14

标签: c assembly

我在程序集中执行程序以通过端口(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运行时崩溃。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果在输入功能时保存CPU寄存器,则需要在完成后恢复它们。您的PUSH需要与POP匹配。

此外,如果您使用堆栈帧来访问局部变量和参数,请在所有内容之前设置框架(push ebp ; mov ebp, esp),以便您可以更轻松地引用它们。这里[ebp+8]没有引用参数,因为你在设置框架之前改变了堆栈。