linux-assembly.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* extended asm+pointers
@ 2004-08-11  9:00 Ankit Jain
  2004-08-11 10:51 ` sandeep
  2004-08-11 18:33 ` Brian Raiter
  0 siblings, 2 replies; 4+ messages in thread
From: Ankit Jain @ 2004-08-11  9:00 UTC (permalink / raw)
  To: linux-assembly

hi

well i want to understand how assembler treats
pointers?

my code is:

      1	#include<inttypes.h>
      2
      3
      4 int main()
      5 {
      6   uint8_t
a[8]={1,2,3,4,5,6,7,8},b[8]={0,0,0,0,0,0},i;
      7   uint8_t *m,*m1;
      8 
      9   m=a;
     10   m1=b;         //i have pointed m1 to b
     11   for(i=0;i<8;i++)
     12      printf("%d ",a[i]);
     13   printf("\n");
     14   asm("movq (%1), %%mm0 \n"
     15       "movq %%mm0, (%0) \n"
     16       :"=r"(m1)
     17       :"r"(m)
     18       );
     19 
     20   for(i=0;i<8;i++)
     21      printf("%d ",b[i]);
     22   return 0;
     23 }
well this problem is not solved yet. because when i
display b array then it prints all 0's. according to
me since i have initialised this m1 pointer then by b
then b whould have all the values which i have moved

some have advised me to use arrays here as constraint
but i want to use pointers. i am using r constraint
and it says it says that m1 will use a register (i
guess there is no problem in that)

what is the complete problem HOW THIS ASSEMBLER IS
TREATING THIS POINTER m1?

thanks 

ankit jain

________________________________________________________________________
Yahoo! Messenger - Communicate instantly..."Ping" 
your friends today! Download Messenger Now 
http://uk.messenger.yahoo.com/download/index.html

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: extended asm+pointers
  2004-08-11  9:00 extended asm+pointers Ankit Jain
@ 2004-08-11 10:51 ` sandeep
  2004-08-11 18:33 ` Brian Raiter
  1 sibling, 0 replies; 4+ messages in thread
From: sandeep @ 2004-08-11 10:51 UTC (permalink / raw)
  To: Ankit Jain; +Cc: linux-assembly

Ankit Jain wrote:
>       4 int main()
>       5 {
>       6   uint8_t
> a[8]={1,2,3,4,5,6,7,8},b[8]={0,0,0,0,0,0},i;
>       7   uint8_t *m,*m1;
>       8 
>       9   m=a;
>      10   m1=b;         //i have pointed m1 to b
>      11   for(i=0;i<8;i++)
>      12      printf("%d ",a[i]);
>      13   printf("\n");

>      14   asm("movq (%1), %%mm0 \n"
>      15       "movq %%mm0, (%0) \n"
>      16       :"=r"(m1)
>      17       :"r"(m)
>      18       );
this asm(...) is effectively achieving "m1=m;" you can verify this by printing 
m1[i] instead of a[i] and b[i]
>      19 
>      20   for(i=0;i<8;i++)
>      21      printf("%d ",b[i]);
>      22   return 0;
>      23 }
> well this problem is not solved yet. because when i
> display b array then it prints all 0's. according to
> me since i have initialised this m1 pointer then by b
> then b whould have all the values which i have moved
> 
> some have advised me to use arrays here as constraint
> but i want to use pointers. i am using r constraint
> and it says it says that m1 will use a register (i
> guess there is no problem in that)

-- 
regards
sandeep
--------------------------------------------------------------------------
Always borrow money from a pessimist; he doesn't expect to be paid
back.
--------------------------------------------------------------------------


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: extended asm+pointers
       [not found] <20040811112319.87376.qmail@web52908.mail.yahoo.com>
@ 2004-08-11 13:04 ` sandeep
  0 siblings, 0 replies; 4+ messages in thread
From: sandeep @ 2004-08-11 13:04 UTC (permalink / raw)
  To: Ankit Jain; +Cc: linux-assembly

[-- Attachment #1: Type: text/plain, Size: 2455 bytes --]

Yeah, on closer look, your code should achieve what you intended. May be 
something more has to be done in "asm ...." to get the correct code generated or 
  may be gcc (v 3.2.3 on i386) is not generating correct code.

I tried slightly modified version of your code (attached file 1.c)
also attaching the output of "gcc -S 1.c" (file 1.s - modified)

original assembly code generated for the "asm(...)" in the code was

#APP
     movq (%eax), %mm0
movq %mm0, (%eax)

#NO_APP

this code is not going to change things, as it is doing like "x=x".

On modifying the code to below (based on how variables were allocated for the test)

#APP
     movq (%eax), %mm0
     leal    -16(%ebp), %eax
movq %mm0, (%eax)

#NO_APP

"gcc 1.s" generates a.out that works the you expect.

Ankit Jain wrote:
> thanks. well i know it is effectively working for
> m1[i] but my question was why it is not working for
> b[i] when pointer points to that location or the
> reality could be pointer dont points to that
> location...but if so then why?
> 
> ankit 
> --- sandeep <sandeep@codito.com> wrote: 
> 
>>Ankit Jain wrote:
>>
>>>      4 int main()
>>>      5 {
>>>      6   uint8_t
>>>a[8]={1,2,3,4,5,6,7,8},b[8]={0,0,0,0,0,0},i;
>>>      7   uint8_t *m,*m1;
>>>      8 
>>>      9   m=a;
>>>     10   m1=b;         //i have pointed m1 to b
>>>     11   for(i=0;i<8;i++)
>>>     12      printf("%d ",a[i]);
>>>     13   printf("\n");
>>
>>>     14   asm("movq (%1), %%mm0 \n"
>>>     15       "movq %%mm0, (%0) \n"
>>>     16       :"=r"(m1)
>>>     17       :"r"(m)
>>>     18       );
>>
>>this asm(...) is effectively achieving "m1=m;" you
>>can verify this by printing 
>>m1[i] instead of a[i] and b[i]
>>
>>>     19 
>>>     20   for(i=0;i<8;i++)
>>>     21      printf("%d ",b[i]);
>>>     22   return 0;
>>>     23 }
>>>well this problem is not solved yet. because when i
>>>display b array then it prints all 0's. according to
>>>me since i have initialised this m1 pointer then by b
>>>then b whould have all the values which i have moved
>>>some have advised me to use arrays here as constraint
>>>but i want to use pointers. i am using r constraint
>>>and it says it says that m1 will use a register (i
>>>guess there is no problem in that)

-- 
regards
sandeep
--------------------------------------------------------------------------
A lack of leadership is no substitute for inaction.
--------------------------------------------------------------------------

[-- Attachment #2: 1.c --]
[-- Type: text/plain, Size: 353 bytes --]

#include <inttypes.h>

int main()
{
	uint32_t a[2]={0x01020304,0x05060708},b[2]={0x0,0x0},i;
	uint32_t *m,*m1;

	m=a;
	m1=b;         //i have pointed m1 to b

	asm volatile ("movq (%1), %%mm0 \n"
		"movq %%mm0, (%0) \n"
		:"=r"(m1)
		:"r"(m)
	);

	for (i=0;i<2;i++)
		printf ("m[%d]=%d, m1[%d]=%d, b[%d]=%d\n", i, m[i], i, m1[i], i, b[i]);
	return 0;
}

[-- Attachment #3: 1.s --]
[-- Type: text/plain, Size: 1057 bytes --]

	.file	"1.c"
	.section	.rodata
	.align 32
.LC0:
	.string	"m[%d]=%d, m1[%d]=%d, b[%d]=%d\n"
	.text
.globl main
	.type	main,@function
main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$40, %esp
	andl	$-16, %esp
	movl	$0, %eax
	subl	%eax, %esp
	movl	$16909060, -8(%ebp)
	movl	$84281096, -4(%ebp)
	movl	$0, -16(%ebp)
	movl	$0, -12(%ebp)
	leal	-8(%ebp), %eax
	movl	%eax, -24(%ebp)
	leal	-16(%ebp), %eax
	movl	%eax, -28(%ebp)
	movl	-24(%ebp), %eax
#APP
	movq (%eax), %mm0 
	leal	-16(%ebp), %eax
movq %mm0, (%eax) 

#NO_APP
	movl	%eax, -28(%ebp)
	movl	$0, -20(%ebp)
.L2:
	cmpl	$1, -20(%ebp)
	jbe	.L5
	jmp	.L3
.L5:
	subl	$4, %esp
	movl	-20(%ebp), %eax
	pushl	-16(%ebp,%eax,4)
	pushl	-20(%ebp)
	movl	-20(%ebp), %eax
	leal	0(,%eax,4), %edx
	movl	-28(%ebp), %eax
	pushl	(%eax,%edx)
	pushl	-20(%ebp)
	movl	-20(%ebp), %eax
	leal	0(,%eax,4), %edx
	movl	-24(%ebp), %eax
	pushl	(%eax,%edx)
	pushl	-20(%ebp)
	pushl	$.LC0
	call	printf
	addl	$32, %esp
	leal	-20(%ebp), %eax
	incl	(%eax)
	jmp	.L2
.L3:
	movl	$0, %eax
	leave
	ret
.Lfe1:
	.size	main,.Lfe1-main
	.ident	"GCC: (GNU) 3.2.3"

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: extended asm+pointers
  2004-08-11  9:00 extended asm+pointers Ankit Jain
  2004-08-11 10:51 ` sandeep
@ 2004-08-11 18:33 ` Brian Raiter
  1 sibling, 0 replies; 4+ messages in thread
From: Brian Raiter @ 2004-08-11 18:33 UTC (permalink / raw)
  To: linux-assembly

>      14   asm("movq (%1), %%mm0 \n"
>      15       "movq %%mm0, (%0) \n"
>      16       :"=r"(m1)
>      17       :"r"(m)
>      18       );

I believe this code copies the contents of m to m1. (Actually, with
movq, I guess it will copy an extra four bytes in the process.) After
it runs, both m and m1 will point to b[].

I think part of your problem is that you're trying to treat an array
as an lvalue. gcc is decomposing your array into a pointer to the
first element, which is not a valid lvalue. So you're trying to do the
same thing via pointers. But it's not the same thing at all.

In other words, you're stumbling with how C treats arrays and
pointers, not the assembler.

Get rid of your m and m1 variables, and try doing this instead:

  asm("movq (%1), %%mm0 \n"
      "movq %%mm0, (%0) \n"
      : : "r"(b), "r"(a)
      );

(Note the lack of output operands. That's because we're not modifying
the "pointer" b. We're just modifying the array that b points to.)

I think this will do what you want.

b

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-08-11 18:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-11  9:00 extended asm+pointers Ankit Jain
2004-08-11 10:51 ` sandeep
2004-08-11 18:33 ` Brian Raiter
     [not found] <20040811112319.87376.qmail@web52908.mail.yahoo.com>
2004-08-11 13:04 ` sandeep

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).