X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-bounces using -f From: "Michael Sisco" Newsgroups: comp.os.msdos.djgpp Subject: extended asm problems (bug???) Date: Fri, 1 Mar 2002 10:21:58 -0600 Lines: 85 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.50.4807.1700 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4807.1700 NNTP-Posting-Host: 161.49.70.118 Message-ID: <3c7faa96$1@news.qgraph.com> X-Trace: news.qgraph.com 1014999702 161.49.70.118 (1 Mar 2002 10:21:42 -0600) Organization: Quad/Graphics,Inc. To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I have some questions concerning extended asm, one general and several specific: First the general question - I have yet to find a very thorough treatise on the use of extended asm with DJGPP. I have found enough to get through the basics, but there are things that don't work as I would have expected, and other things that I just can't find an example of. My general question is: What is the definitive text on using extended asm with DJGPP? My more specific questions: 1) This one appears to me to be a bug. The following code fragment compiles fine, and the .s file contains exactly the asm code I would expect, as long as optimizations are not turned on. However, when I turn on optimizations (-O3), the compiler attempts to use the di register for a movb at the location shown. The linker has serious issues with this attempt, and gives an error message stating that the data size is invalid for mov instruction. // uchar is of course a typedef for unsigned char, and the various eValues are members of an enumeration. void QClock::vSetRTClockTime(uchar ucHours, uchar ucMin, uchar ucSec) { __asm__ __volatile__( "movb %2, %%al\n\t" "out %%al, %0\n\t" "movb %5, %%al\n\t" <<<=== OK if no optimization ("movb -1(%ebp), %al) "out %%al, %1\n\t" // set the hours // Irrelevant code deleted... : : "g" (eCLOCK_WRITE_PORT), "g" (eCLOCK_REG_PORT), "g" (eHOURS), "g" (eMINUTES), "g" (eSECONDS), "g" (ucHours), "g" (ucMin), "g" (ucSec) : "ax" ); } Here's the output from the .s file (I've pulled out the irrelevant parts): .ascii "QClock::vSetRTClockTime\0" .p2align 4 .globl __ZN6QClock15vSetRTClockTimeEhhh __ZN6QClock15vSetRTClockTimeEhhh: LFB10: pushl %ebp LCFI46: movl %esp, %ebp LCFI47: pushl %edi LCFI48: pushl %esi LCFI49: pushl %ebx LCFI50: subl $24, %esp LCFI51: movb 20(%ebp), %bl movzbl 12(%ebp), %edi movzbl 16(%ebp), %esi /APP movb $4, %al out %al, $112 movb %di, %al <<<=== Error occurs here!!!! out %al, $113 // set the hours Any idea what might be happening here? 2) A colleague of mine has the following question: This is simply a matter of syntax translation, but I can't find the answer anywhere: How would you convert the following statements to AT&T syntax? MOV ES:[BX][DI], AL MOV SI, ES:[DI] MOV AL, ES:[BX][DI] MOV ES:[DI], BX 3) Hopefully simple: We have been unable to use any labels within an __asm__ block other than numbers(i.e. 0:, 1:, 23:). Is this a real limitation, or are we missing something? Thanks for your time, Michael