From: Larry Swanson Newsgroups: comp.os.msdos.djgpp Subject: NASM + DJGPP newbie problem Date: Wed, 17 Sep 1997 07:52:49 -0500 Organization: MidWest Communications, Inc. Lines: 136 Message-ID: <341FD2A0.54CC1C76@mwci.net> NNTP-Posting-Host: dial-54.man.mwci.net Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Precedence: bulk Hello I recently decided to learn how to program in assembly using NASM and DJGPP. I'm having a problem trying to get the following code to work. (I usually get a message like 'access denied') that appears to be when I push something on the stack. Also I have a few questions I know that SS=stack selector, CS = code selector, DS= data selector and that ES is extra selector. My question is, what are fs and gs? can I put a selector for the LFB there and leave it there or does DJGPP use it for anything? Also I am learning ASM just using "Michael Abrash's Zen of Code optimization" and "Interfacing DJGPP with assembly procedures." Could any body reccomend some better learning materials.(These are both excellent documents but they are exactly trying to teach asm.) Thank you again; Here is my code(lifted from "Interfacing DJGPP with assembly procedures.") [BITS 32] [GLOBAL _AddFour] [GLOBAL _VersionString] [GLOBAL _Return_Test] [GLOBAL _Print] [EXTERN _printf] [EXTERN _Exported] [EXTERN _variable] [SECTION .text] ;----------------------------------------------------------------------------> ;prototype AddFour(unsigned int x); ; ;----------------------------------------------------------------------------> x_add_four equ 8 _AddFour: push ebp; mov ebp , esp; mov eax , [ebp + x_add_four]; add eax , [AddConstant]; ;leave reult in eax for return to c mov ebp,esp pop ebp ret ;End of AddFour--------------------------------------------------------------> ;----------------------------------------------------------------------------- ;prototype unisgned int Return_Test(void); ; this returns the global variable "variable" ;----------------------------------------------------------------------------- _Return_Test: push ebp mov ebp,esp mov eax,[_variable] mov ebp,esp pop ebp ret ;end return_test-------------------------------------------------------------- ;----------------------------------------------------------------------------- ;prototype Print(); ;----------------------------------------------------------------------------- _Print: push ebp mov ebp,esp push dword _VersionString push dword PrintTemplate1 call _printf push dword [_Exported] push dword PrintTemplate2 call _printf mov ebp,esp pop ebp ret ;end Print-------------------------------------------------------------------- [SECTION .data] AddConstant dd 00000004h ; d-word _VersionString db "NASMTEST.ASM-Version 0.0a",00h ;array of bytes PrintTemplate1 db "VersionString = '%s'",0ah,00h PrintTemplate2 db "unsigned int Exported = 0x%8x",0ah,00h //now my c file #include #include extern unsigned int AddFour(int x);//assembly language procedure extern char VersionString[]; extern unsigned int Return_Test(void); extern void Print(); int Exported=0xfff00ffa; int variable =0xdeadbeef; int main(){ int test=4; printf("\ntest =%i",test); printf("\nAddFour(test)=%i",AddFour(test)); printf("\n Return_Test()=0x%X\n",Return_Test() ); Print(); return 0; }