Advertisement

DJGPP asm

Started by December 17, 1999 12:39 AM
5 comments, last by bosjoh 25 years ago
I'm not 100% positive (I stopped using DJGPP about a year ago), but I believe it would look like this: (DJGPP uses AT&T syntax)
code:
void buf_to_screen() {    asm("movl $0x12C00 %ecx\n\t"        "cld\n\t"        "rep\n\t"        "movsd"        :        : "S" (buffer), "D" (screen)        : "%ecx", "%esi", "%edi"    );}

The stuff at the end on the ":" lines are where you declare your output registers, registers loaded, and your clobber list, in that order.

As I said before, I haven't programmed in DJGPP in a while (or recently done much inline asm for that matter ) so this might not be totally correct, but I hope it helps.

------------------
Where's my Golden Fleece?

[This message has been edited by Aeetes (edited December 16, 1999).]

I haven't done anything with DJGPP in about two years, but the above looks correct, except that "movsd" should be "movsl"

There's a great tutorial on DJGPP ASM, I think written by "Brennan something." Should be able to find a link to it off of DJ Delorie's site.

Advertisement
Thanks!
I figured out some of the asm (i knew %eax etc. and movl src, dest).
I was having most of the problems with the things you should put behind the semicolons.
hmm...
it doesn't work.
Output:
Error: invalid 'asm' statement
Error: Fixed or forbidden register 4 (si) was spilled for class SIREG

If I remove the last (semicolon) line I get one error.

Error: operand number missing after %-letter

Any solutions?

After seeing the error output you got I think I see what is wrong from that listing I posted.

  • On the third ":" line for the clobbered list... I think that the error about si being "spilled" is caused because %esi (and additionally %edi) shouldn't be on the clobbered list, only %ecx was clobbered by the code given. This is because GCC knows about the registers being loaded into, so you don't have to tell it that they are clobbered.

  • The first set of error messages were caused by this I think. I also forgot that since we are modifying some memory, we need to add "memory" to the clobbered list.

  • The error message you got on the second pass was caused by the leaving out of an extra % when prefixing the register ecx. In extended inline assembly (what it is called when using the ":" lines), registers have to be prefixed by two %'s, e.g. "%%ecx". A single % is used before a number to identify an input (applies when using general "g" and "r" instead of specific "D" and "S" in our case in declaring inputs). DJGPP needs the two %'s to distinguish between the two uses.

Therefore I believe the code should actually look like this:
code:
void buffer_to_screen() {    asm("movl $0x12C00 %%ecx\n\t"        "cld\n\t"        "reg\n\t"        "movsl"        :        : "S" (buffer), "D" (screen)        : "$ecx", "memory"    );}

Here are a couple pages that you could check out for more detailed information:

Hope this gets you running...

------------------
Where's my Golden Fleece?

[This message has been edited by Aeetes (edited December 16, 1999).]

Anyone knows how to program this:

void buf_to_screen(){
asm{
mov edi, screen
mov esi, buffer
mov ecx, 76800
rep movsd
};
};

In DJGPP?

Advertisement
Thanx again.

This topic is closed to new replies.

Advertisement