Page 2 of 2
Re: Problems with GNU as Intel syntax
Posted: Thu Jan 29, 2009 10:52 pm
by SimonZilch
earlz wrote:
I'm not sure if it matters, but when I did gas with intel syntax in my OS, I did
I'm not sure of the difference though
"prefix" means you want to use percent signs('%') before your registers. "noprefix" means you don't. From what I've been able to determine, that's the only difference, and it has nothing to do with dollar signs('$'). Most Intel syntax assemblers (that I've used) don't prefix the registers with anything, but I like the idea of having a prefix to distinguish registers from labels. Unfortunately though, after years of using other assemblers, I'm too accustomed to NOT typing the prefix; so I've just given up trying and dropped the prefix.
Just to remind people of my remaining question:
SimonZilch wrote:The second problem I ran into is a warning for this code:
. . .
The warning is: "Warning: Treating `dword ptr [0xb8000]' as memory reference"
That doesn't make sense. Of course it's treating it as a memory reference. I very explicitly told it that it's a memory reference. . . .
So how do I get rid of this warning? Is my syntax wrong? If so, how do I do it right?
I've also determined that this gives the same warning:
Code: Select all
.set VIDEO_MEM, 0xb8000 # same result with .eqv or .equiv instead of .set
mov dword ptr [VIDEO_MEM], eax
as says: " Warning: Treating `dword ptr [VIDEO_MEM]' as memory reference"
Any thoughts?
Re: Problems with GNU as Intel syntax
Posted: Fri Jan 30, 2009 9:47 am
by earlz
This is strange. With my GCC it doesn't give any warnings on your code(with -Wall)
My test file is
Code: Select all
#include <stdlib.h>
#include <stdio.h>
int a;
int main(){
__asm(".intel_syntax noprefix\n"
"mov dword ptr [0xb8000], eax\n"
".att_syntax\n");
return 0;
}
are your trying to do inline code or standalone assembly files?
Code: Select all
[earlz@EarlzBeta-~] $ gcc --version
gcc (GCC) 3.3.5 (propolice)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[earlz@EarlzBeta-~] $ as --version
GNU assembler 2.15
Copyright 2002 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
This assembler was configured for a target of `i386-unknown-openbsd4.4'.
Re: Problems with GNU as Intel syntax
Posted: Fri Jan 30, 2009 1:24 pm
by SimonZilch
earlz wrote:This is strange. With my GCC it doesn't give any warnings on your code(with -Wall)
. . .
are your trying to do inline code or standalone assembly files?
. . .
I was doing plain standalone assembly, but it doesn't make any difference:
Code: Select all
simon@zilch1:~$ cat test.c
int main()
{
__asm(".intel_syntax noprefix\n"
"mov dword ptr [0xb8000], eax\n"
".att_syntax\n");
return 0;
}
simon@zilch1:~$ gcc -m32 -Xassembler --32 -c test.c
/tmp/ccukgSfh.s: Assembler messages:
/tmp/ccukgSfh.s:13: Warning: Treating `dword ptr [0xb8000]' as memory reference
Note that "-m32" and "-Xassembler --32" tell the compiler and assembler (respectively) that I want 32-bit code (since I'm on a 64-bit system). It does the same thing with "-m64 -Xassembler --64".
My assembler version is a little more recent than yours by a few years:
Code: Select all
simon@zilch1:~$ as --version
GNU assembler version 2.17.50.0.18-1 20070731
Copyright 2007 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or later.
This program has absolutely no warranty.
This assembler was configured for a target of `x86_64-redhat-linux'.
I guess the warning must have been added to the assembler after your version. I doubt it's anything with the compiler, but my gcc version's a little more recent too.
Re: Problems with GNU as Intel syntax
Posted: Fri Jan 30, 2009 1:33 pm
by earlz
hmm.. gcc and as must be getting a little rusty with its old age and code bloat lol
Re: Problems with GNU as Intel syntax
Posted: Sat Feb 14, 2009 9:46 am
by cygx
There is even more strangeness afoot. Consider the following code:
Code: Select all
void test(void)
{
__asm__("movl %eax,($0xdeadbeaf)");
__asm__("movl %eax,(%ecx)");
__asm__(".intel_syntax prefix");
__asm__("mov [dword ptr $0xdeadbeaf],%eax");
__asm__("mov [dword ptr %ecx],%eax");
__asm__(".intel_syntax noprefix");
__asm__("mov [dword ptr 0xdeadbeaf],eax");
__asm__("mov [dword ptr ecx],eax");
__asm__(".att_syntax prefix");
}
When you look at the objdump, you'll find this
Code: Select all
3: a3 00 00 00 00 mov %eax,0x0
8: 89 01 mov %eax,(%ecx)
a: a3 00 00 00 00 mov %eax,0x0
f: 89 01 mov %eax,(%ecx)
11: a3 af be ad de mov %eax,0xdeadbeaf
16: 89 01 mov %eax,(%ecx)
Only the line which generates the warning won't silently drop the value!?
----
Now, look at this code
Code: Select all
void test(void)
{
*(int *)0xdeadbeaf = 0x1234;
__asm__(".att_syntax prefix");
__asm__("movl $0x1234,($0xdeadbeaf)");
/* this won't compile: Error: too many memory references for 'mov'
__asm__(".intel_syntax prefix");
__asm__("mov [dword ptr $0xdeadbeaf],$0x1234");
*/
__asm__(".intel_syntax noprefix");
__asm__("mov [dword ptr 0xdeadbeaf],0x1234");
__asm__(".att_syntax prefix");
}
and its objdump
Code: Select all
3: c7 05 af be ad de 34 movl $0x1234,0xdeadbeaf
a: 12 00 00
d: c7 05 00 00 00 00 34 movl $0x1234,0x0
14: 12 00 00
17: c7 05 af be ad de 34 movl $0x1234,0xdeadbeaf
1e: 12 00 00
Anyone here who can explain this?
Re: Problems with GNU as Intel syntax
Posted: Sat Feb 14, 2009 1:44 pm
by cygx
Anyone here who can explain this?
I actually figured this out myself with help from the nice people at stackoverflow.
Here it the aswer as to
How to use address constants in GCC x86 inline assembly.