www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1998/09/06/10:32:33

From: Endlisnis <s257m AT unb DOT ca>
Newsgroups: comp.os.msdos.djgpp
Subject: Bug in GCC?
Date: Sun, 06 Sep 1998 11:06:00 -0300
Organization: NBTel Internet
Lines: 62
Message-ID: <35F296C8.EE7B49C7@unb.ca>
NNTP-Posting-Host: fctnts05c94.nbnet.nb.ca
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

The program doesn't compile as I would expect.  All it was spose to do is
show how you could use inline asm to add 2 integers.  But, the return value
was always 4.  So I looked at the asm code generated for the function, it
reads from port 0x83 and does some loops and stuff.  All I wanted was 1 add.
	And the debugger (when the asm window is open) can't debug it right.  It
skips lines and weird things happen, registers change values without any
obvious reason.

Note: Moving the function after the main makes GCC compile it as expected.  I
am using DJGPP v2.8.1 from RHIDE with "-Wall" and "-g" on, nothing else. 
Also, I've tried compiling it on a different machine with the same results.

-----------Code---------------
#include <iostream.h>

int add(int a, int b)
{
 int Ret;
 asm ("addl %1, %0"
 : "=r" (Ret)
 : "0" (a), "r" (b)
 );
 return Ret;
 }


int main()
{
 int a=2,b=4;
 cout << add(a,b);
 return 0;
 }
	
--------Asm for add(int,int)-----------
pushl  %ebp
inl    $0x83,%eax   //Why is it reading from a port?
inb    (%dx),%al    //And here?
pushl  %ebx
decl   %ebp
popl   %ebp
orb    $0x1,%al     //Oring al with 1??
leave
decl   %ebp
cld
pushl  %ebp
cld
movl   %edx,%eax
jmp    add__Fii+28
jbe    add__Fii+28
popl   %ebp
clc
leave
ret
jbe    main

-- 
     (\/) Endlisnis (\/)
          s257m AT unb DOT ca
          Endlisnis AT GeoCities DOT com
          Endlis AT nbnet DOT nb DOT ca


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019