Code Comments
Programming Forum and web based access to our favorite programming groups.Hi All, There is a complicated issue here. I have downloaded fasm source of a driver and want to integrate it to my kernel. However, there is a problem: 1. If i call a FASM function from within C code (kernel), it is not able to return back to the next line in C Code 2. If i call a NASM function 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 a global keyword or similar stuff in FASM?
Post Follow-up to this messagesuchi_01 wrote:
> Hi All,
> There is a complicated issue here. I have downloaded
> fasm source of a driver and want to integrate it to my kernel.
> However, there is a problem:
>
> 1. If i call a FASM function 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 a NASM function 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 a global keyword or similar stuff in FASM?
"public", AFAIK. We need to tell Fasm a "format", too (in the source,
not on the command line like Nasm). As a test, I just "converted" a Nasm
demo I had to Fasm (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 think Fasm supports OMF. What format are
you using?
Best,
Frank
;---------------
format elf
public getvendor
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;
}
Post Follow-up to this messageHi Frank,
Thanks for the reply. Will try it and let you know. This
is precisely what i want to do, but the problem is that the bootsector
code does not have an elf loader yet, so i don't know whether .text
part will be identified and put in the right place or not during boot
process
Suchindra Chandrahas
On Mar 22, 3:24 pm, Frank Kotler <spamt...@crayne.org> wrote:
> suchi_01 wrote:
>
>
> What *does* it do?
>
>
>
>
>
>
>
>
>
>
>
>
> "public", AFAIK. We need to tell Fasm a "format", too (in the source,
> not on the command line like Nasm). As a test, I just "converted" a Nasm
> demo I had to Fasm (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 think Fasm supports OMF. What format are
> you using?
>
> Best,
> Frank
>
> ;---------------
> format elf
>
> public getvendor
>
> 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;
> }
Post Follow-up to this messagesuchi_01 wrote: > Hi Frank, > Thanks for the reply. Will try it and let you know. This > is precisely what i want to do, but the problem is that the bootsector > code does not have an elf loader yet, so i don't know whether .text > part will be identified and put in the right place or not during boot > process Hi Suchindra, Doesn't sound like a Fasm/Nasm problem, really. You might want to look at GRUB, rather than write your own. http://www.gnu.org/software/grub/ Best, Frank
Post Follow-up to this messageHi 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...@crayne.org> wrote:
> suchi_01 wrote:
>
>
> What *does* it do?
>
>
>
>
>
>
>
>
>
>
>
>
> "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 thinkFasmsupports 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;
> }
Post Follow-up to this messagesuchi_01 wrote: > 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! Very mysterious. I'm still not sure where the C code begins and ends, but in any case, the call puts a return address on the stack. If it finds your assembly function, the "ret" ought to return to the same place, whether it was generated by Nasm or Fasm. Possible issue with "bitness"? If all else fails, converting Fasm source to Nasm shouldn't be too difficult... but you really shouldn't have to! Best, Frank
Post Follow-up to this messageoops! worked fine. Sorry i forgot another fasm file where i had to insert the same. Sorry for the confusion. What you say is right On Mar 24, 10:52 am, suchi_01 <spamt...@crayne.org> wrote: > 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...@crayne.org> wrote: > > > > > > > > > > > > > > > > > > > > > >
Post Follow-up to this messageOn Mar 24, 12:10 pm, Frank Kotler <spamt...@crayne.org> wrote: > suchi_01 wrote: Hi Frank, I do agree with grub. It makes things easier. But looking at the problem,i feel we would still have to call the assembly part from C when it comes to loading the initial part to Kernel Suchindra Chandrahas > > Hi Suchindra, > > Doesn't sound like a Fasm/Nasm problem, really. You might want to look > at GRUB, rather than write your own. > > http://www.gnu.org/software/grub/ > > Best, > Frank
Post Follow-up to this message
Show a Printable Version
Email This Page to Someone!
Receive updates to this thread
Powered by vBulletin
Copyright 2000-2006 Jelsoft Enterprises Limited.