Hi Frank,
I am sorry i was not clear about the environment. The code
(assembly language function) is called during boot time by a
bootsector code (after enabling protected mode). I am successful in
calling the function but it does not return back to the C code back
(ie., next line after the call in C Code). At boot time there is no
elf loader and it is difficult to point it to where it has to return.
Mysteriously, using global in nasm does the stuff!
Suchindra Chandrahas
On Mar 22, 3:24 pm, Frank Kotler <spamt...@[EMAIL PROTECTED]
> wrote:
> suchi_01 wrote:
> > Hi All,
> > There is a complicated issue here. I have downloaded
> >fasmsource of a driver and want to integrate it to my kernel.
> > However, there is a problem:
>
> > 1. If i call aFASMfunction from within C code (kernel), it is not
> > able to return back to the next line in C Code
>
> What *does* it do?
>
>
>
> > 2. If i call aNASMfunction from within C Code, it works properly (it
> > returns back to next line in C Code)
>
> > Here are the code snippets:
>
> >NASM:
>
> >global<func name>
>
> > <func name>:
> > ret
>
> >FASM:
>
> >public<func name>
>
> > <func name>:
> > ret
>
> > Is there aglobalkeyword or similar stuff inFASM?
>
> "public", AFAIK. We need to tellFasma "format", too (in the source,
> not on the command line likeNasm). As a test, I just "converted" aNasm
> demo I had toFasm(just added "format elf", changed "global" to
> "public" and fixed up the section declaration). Worked fine. The only
> issue I can see is that I don't thinkFasmsup****ts OMF. What format are
> you using?
>
> Best,
> Frank
>
> ;---------------
> format elf
>
> publicgetvendor
>
> section ".text" executable
> getvendor:
> pusha
> xor eax, eax
> cpuid
> mov eax, [esp + 36]
> mov [eax], ebx
> mov [eax + 4], edx
> mov [eax + 8], ecx
> mov byte [eax + 12], 0
> popa
> xor eax, eax
> ret
> ;-----------------
>
> And the C caller...
>
> #include <stdio.h>
>
> void getvendor(char *vendorbuf);
>
> int main(void)
> {char vendorbuf[13];
> getvendor(vendorbuf);
>
> puts(vendorbuf);
> return 0;
> }


|