Please help with ASM

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
cometkeeper

Please help with ASM

Post by cometkeeper »

Hallo, I'm trying to understand some differences between intel and at&t asm.

This intel code works ok. It stores a char into the video memory.

start:
mov ax,0xb800
mov ds,ax
mov si,0x0
mov byte [ds:si],0x22
inc si
mov byte [ds:si],0x07
start1:
jmp start1

I tried to translate it into the at&t asm but I cannot understand where the problem is. Can anyone translate it for me????

OTHER QUESTION if I may:

I'm using djgpp.

I have problem when I try to use asm in my .c file. I have to separate each line with the " otherwise I get an error.
When I use this way and I need to specify some in/out/reg. I get another error: "asm template is not a string constant"

__asm__("movw %0,%%ax" : : "=g" (i) );

this generate that error.... Does anyone know where is the problem?

Thank you and sorry if I kept it long...
frank

Re:PLEASE HELP WITH ASM

Post by frank »

hallo,
Are you dutch/belgium?
I have problem when I try to use asm in my .c file. I have to separate each line with the " otherwise I get an error.
Use the ; to seprate, so like this

Code: Select all

asm volatile("mov $3,%ax";
                          "mov $4,%bx");
Btw, you can also just use a pointer into the memory
( int * mem ) for writing to the video memory.
I don't know if this is faster in anyway (it might get optimized by the compiler)
Schol-R-LEA

Re:PLEASE HELP WITH ASM

Post by Schol-R-LEA »

waits for ears to stop ringing from Cometkeeper's shouting in the Subject line

Hmmn, this probably should be in the General Programming forum... Anyway, here's a quick-and-dirty translation of you code into AT&T syntax. This has not been tested, but it should be what you want:

Code: Select all

start:
        movw 0xb800, %ax
        movw %ax, %ds
        movw 0x00, %si
        movb 0x22, %ds:(%si)
        incw si
        movb 0x07, %ds:(%si)
start1:
        jmp start1
Keep in mind that if you are using this for 16-bit real mode programming, you need to add the directive

Code: Select all

.code16
at the beginning of the code.

For more details on AT&T syntax, see reply #4 in this thread. HTH. C&CW.
Therx

Re:PLEASE HELP WITH ASM

Post by Therx »

Very OT
Schol-R-LEA wrote: C&CW.
Huh. What's that an abbreviation for?

Pete
Schol-R-LEA

Re:PLEASE HELP WITH ASM

Post by Schol-R-LEA »

"Comments and Corrections Welcome". That is to say, if I made a mistake, or if you have something productive to add, feel free to add speak you mind about it. Similarly, "CCW" (without the ampersand) means "Constructive Criticism Welcome".
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:Please help with ASM

Post by Pype.Clicker »

hmm ... i haven't looked deeply at it, but using "ds <= b800" in a DjGpp environment makes me feel the urge to remind you that DjGPP is a 32 bits compiler, and 32bits mode is unlikely to allow a *selector* that has value b800 (typical from real mode addresses)
cometkeeper

Re:Please help with ASM

Post by cometkeeper »

Ok, I'll try to explain the problems:

this is may .c

----test.c----
int main(void)
{
   int i;

   __asm__("movw $0x1, %ax\n
       movw $0x2, %bx");
   
   return 0;
}

This generate the error:
test.c:5:17: missing terminating " character
test.c: In function `main':
test.c:6: error: parse error before "movw"
test.c:6:32: missing terminating " character

I compiled with
gcc test.c (maybe I miss some compiler switch???)

To solve this problem I have to do this

__asm__("movw $0x1, %ax\n movw $0x2, %bx");

This doesn't get any error, but when you ave long asm code is

impossible to write every instruction in a row.

Second problem:

__asm__("movw %%ax,%0": : "=g" (i));

generates:
test.c: In function `main':
test.c:5: error: input operand constraint contains `='

I knew that the output operand was the second
__asm__("asm-stat":input:output:register);
Isn't it????

If I separate the row I don't get any error

__asm__("movw $0x1, %ax",
    movw $0x2, %bx");

but

__asm__("movw %%ax, %0",
    movw %%ax, %%bx"
   :
   : "=g" (i)
   );

gets:
test.c: In function `main':
test.c:9: error: asm template is not a string constant


And... In reply to the translated code I get this error at:

movb $0x22, %ds:(%si)

c:/djgpp/tmp/cchS4U2H.s: Assembler messages:
c:/djgpp/tmp/cchS4U2H.s:12: Error: `%ds:(%si)' is not a valid 32 bit base/index
expression


Thank you....
User avatar
Pype.Clicker
Member
Member
Posts: 5964
Joined: Wed Oct 18, 2006 2:31 am
Location: In a galaxy, far, far away
Contact:

Re:Please help with ASM

Post by Pype.Clicker »

cometkeeper wrote: Ok, I'll try to explain the problems:

this is may .c

----test.c----
int main(void)
{
int i;

__asm__("movw $0x1, %ax\n
movw $0x2, %bx");

return 0;
}

This generate the error:
test.c:5:17: missing terminating " character
test.c: In function `main':
test.c:6: error: parse error before "movw"
test.c:6:32: missing terminating " character

I compiled with
gcc test.c (maybe I miss some compiler switch???)
Hum. Seems like a little browsing of 'info gcc' may help you ;)

The problem here is that multi-line strings are not really standard in C. Some compilers/version support them, other don't. However, i think ansi-C forces the compiler to concatenate strings separate only by "blank" symbols, thus you could write

Code: Select all

asm ("push es\n"
       "pop ds");
and it should work fine ...
Second problem:

__asm__("movw %%ax,%0": : "=g" (i));

generates:
test.c: In function `main':
test.c:5: error: input operand constraint contains `='

I knew that the output operand was the second
__asm__("asm-stat":input:output:register);
Isn't it????
I wouldn't bet on this ... it's more likely to be
asm ("asm-stat":output:input:scratched);

And... In reply to the translated code I get this error at:

movb $0x22, %ds:(%si)

c:/djgpp/tmp/cchS4U2H.s: Assembler messages:
c:/djgpp/tmp/cchS4U2H.s:12: Error: `%ds:(%si)' is not a valid 32 bit base/index expression
you needn't to explicitly require '%ds:' : it's the default segment register... however, (%si) is -- as the assembler tells you -- a 16 bits addressing mode. (%esi) would be more likely to be accepted. I think if you want to use 16 bits addressing with AS, you have to put the A16 prefix override for each instruction, though i never tried it myself ...
Post Reply