Passing 64-bit function arguments to assembler

Mischa Baars mjbaars1977@gmail.com
Fri Oct 12 08:55:00 GMT 2012


Hi,

Here's a possible bug in the compiler:

As can be seen from the objdump output, 64-bit arguments are passed in 
32-bit registers

000000000040049c <main>:
   40049c:    55                       push   rbp
   40049d:    48 89 e5                 mov    rbp,rsp
   4004a0:    be 44 44 00 00           mov    esi,0x4444
   4004a5:    bf 33 33 00 00           mov    edi,0x3333
   4004aa:    e8 05 00 00 00           call   4004b4 <function>
   4004af:    90                       nop
   4004b0:    5d                       pop    rbp
   4004b1:    c3                       ret
   4004b2:    66 90                    xchg   ax,ax

also the opcodes on line 4004AF and 4004B2 seem obsolete.

Best Regards,
Mischa.
-------------- next part --------------

./a.out:     file format elf64-x86-64


Disassembly of section .init:

0000000000400358 <_init>:
  400358:	48 83 ec 08          	sub    rsp,0x8
  40035c:	e8 5b 00 00 00       	call   4003bc <call_gmon_start>
  400361:	48 83 c4 08          	add    rsp,0x8
  400365:	c3                   	ret    

Disassembly of section .plt:

0000000000400370 <__libc_start_main@plt-0x10>:
  400370:	ff 35 ca 04 20 00    	push   QWORD PTR [rip+0x2004ca]        # 600840 <_GLOBAL_OFFSET_TABLE_+0x8>
  400376:	ff 25 cc 04 20 00    	jmp    QWORD PTR [rip+0x2004cc]        # 600848 <_GLOBAL_OFFSET_TABLE_+0x10>
  40037c:	0f 1f 40 00          	nop    DWORD PTR [rax+0x0]

0000000000400380 <__libc_start_main@plt>:
  400380:	ff 25 ca 04 20 00    	jmp    QWORD PTR [rip+0x2004ca]        # 600850 <_GLOBAL_OFFSET_TABLE_+0x18>
  400386:	68 00 00 00 00       	push   0x0
  40038b:	e9 e0 ff ff ff       	jmp    400370 <_init+0x18>

Disassembly of section .text:

0000000000400390 <_start>:
  400390:	31 ed                	xor    ebp,ebp
  400392:	49 89 d1             	mov    r9,rdx
  400395:	5e                   	pop    rsi
  400396:	48 89 e2             	mov    rdx,rsp
  400399:	48 83 e4 f0          	and    rsp,0xfffffffffffffff0
  40039d:	50                   	push   rax
  40039e:	54                   	push   rsp
  40039f:	49 c7 c0 50 05 40 00 	mov    r8,0x400550
  4003a6:	48 c7 c1 c0 04 40 00 	mov    rcx,0x4004c0
  4003ad:	48 c7 c7 9c 04 40 00 	mov    rdi,0x40049c
  4003b4:	e8 c7 ff ff ff       	call   400380 <__libc_start_main@plt>
  4003b9:	f4                   	hlt    
  4003ba:	66 90                	xchg   ax,ax

00000000004003bc <call_gmon_start>:
  4003bc:	48 83 ec 08          	sub    rsp,0x8
  4003c0:	48 8b 05 69 04 20 00 	mov    rax,QWORD PTR [rip+0x200469]        # 600830 <_DYNAMIC+0x1d0>
  4003c7:	48 85 c0             	test   rax,rax
  4003ca:	74 02                	je     4003ce <call_gmon_start+0x12>
  4003cc:	ff d0                	call   rax
  4003ce:	48 83 c4 08          	add    rsp,0x8
  4003d2:	c3                   	ret    
  4003d3:	66 2e 0f 1f 84 00 00 	nop    WORD PTR cs:[rax+rax*1+0x0]
  4003da:	00 00 00 
  4003dd:	0f 1f 00             	nop    DWORD PTR [rax]

00000000004003e0 <deregister_tm_clones>:
  4003e0:	b8 67 08 60 00       	mov    eax,0x600867
  4003e5:	55                   	push   rbp
  4003e6:	48 2d 60 08 60 00    	sub    rax,0x600860
  4003ec:	48 83 f8 0e          	cmp    rax,0xe
  4003f0:	48 89 e5             	mov    rbp,rsp
  4003f3:	77 02                	ja     4003f7 <deregister_tm_clones+0x17>
  4003f5:	5d                   	pop    rbp
  4003f6:	c3                   	ret    
  4003f7:	b8 00 00 00 00       	mov    eax,0x0
  4003fc:	48 85 c0             	test   rax,rax
  4003ff:	74 f4                	je     4003f5 <deregister_tm_clones+0x15>
  400401:	5d                   	pop    rbp
  400402:	bf 60 08 60 00       	mov    edi,0x600860
  400407:	ff e0                	jmp    rax
  400409:	0f 1f 80 00 00 00 00 	nop    DWORD PTR [rax+0x0]

0000000000400410 <register_tm_clones>:
  400410:	b8 60 08 60 00       	mov    eax,0x600860
  400415:	55                   	push   rbp
  400416:	48 2d 60 08 60 00    	sub    rax,0x600860
  40041c:	48 c1 f8 03          	sar    rax,0x3
  400420:	48 89 e5             	mov    rbp,rsp
  400423:	48 89 c2             	mov    rdx,rax
  400426:	48 c1 ea 3f          	shr    rdx,0x3f
  40042a:	48 01 d0             	add    rax,rdx
  40042d:	48 89 c6             	mov    rsi,rax
  400430:	48 d1 fe             	sar    rsi,1
  400433:	75 02                	jne    400437 <register_tm_clones+0x27>
  400435:	5d                   	pop    rbp
  400436:	c3                   	ret    
  400437:	ba 00 00 00 00       	mov    edx,0x0
  40043c:	48 85 d2             	test   rdx,rdx
  40043f:	74 f4                	je     400435 <register_tm_clones+0x25>
  400441:	5d                   	pop    rbp
  400442:	bf 60 08 60 00       	mov    edi,0x600860
  400447:	ff e2                	jmp    rdx
  400449:	0f 1f 80 00 00 00 00 	nop    DWORD PTR [rax+0x0]

0000000000400450 <__do_global_dtors_aux>:
  400450:	80 3d 05 04 20 00 00 	cmp    BYTE PTR [rip+0x200405],0x0        # 60085c <__bss_start>
  400457:	75 11                	jne    40046a <__do_global_dtors_aux+0x1a>
  400459:	55                   	push   rbp
  40045a:	48 89 e5             	mov    rbp,rsp
  40045d:	e8 7e ff ff ff       	call   4003e0 <deregister_tm_clones>
  400462:	5d                   	pop    rbp
  400463:	c6 05 f2 03 20 00 01 	mov    BYTE PTR [rip+0x2003f2],0x1        # 60085c <__bss_start>
  40046a:	f3 c3                	repz ret 
  40046c:	0f 1f 40 00          	nop    DWORD PTR [rax+0x0]

0000000000400470 <frame_dummy>:
  400470:	48 83 3d e0 01 20 00 	cmp    QWORD PTR [rip+0x2001e0],0x0        # 600658 <__JCR_END__>
  400477:	00 
  400478:	74 1b                	je     400495 <frame_dummy+0x25>
  40047a:	b8 00 00 00 00       	mov    eax,0x0
  40047f:	48 85 c0             	test   rax,rax
  400482:	74 11                	je     400495 <frame_dummy+0x25>
  400484:	55                   	push   rbp
  400485:	bf 58 06 60 00       	mov    edi,0x600658
  40048a:	48 89 e5             	mov    rbp,rsp
  40048d:	ff d0                	call   rax
  40048f:	5d                   	pop    rbp
  400490:	e9 7b ff ff ff       	jmp    400410 <register_tm_clones>
  400495:	e9 76 ff ff ff       	jmp    400410 <register_tm_clones>
  40049a:	66 90                	xchg   ax,ax

000000000040049c <main>:
  40049c:	55                   	push   rbp
  40049d:	48 89 e5             	mov    rbp,rsp
  4004a0:	be 44 44 00 00       	mov    esi,0x4444
  4004a5:	bf 33 33 00 00       	mov    edi,0x3333
  4004aa:	e8 05 00 00 00       	call   4004b4 <function>
  4004af:	90                   	nop
  4004b0:	5d                   	pop    rbp
  4004b1:	c3                   	ret    
  4004b2:	66 90                	xchg   ax,ax

00000000004004b4 <function>:
  4004b4:	c3                   	ret    
  4004b5:	66 2e 0f 1f 84 00 00 	nop    WORD PTR cs:[rax+rax*1+0x0]
  4004bc:	00 00 00 
  4004bf:	90                   	nop

00000000004004c0 <__libc_csu_init>:
  4004c0:	48 89 6c 24 d8       	mov    QWORD PTR [rsp-0x28],rbp
  4004c5:	4c 89 64 24 e0       	mov    QWORD PTR [rsp-0x20],r12
  4004ca:	48 8d 2d 7f 01 20 00 	lea    rbp,[rip+0x20017f]        # 600650 <__init_array_end>
  4004d1:	4c 8d 25 70 01 20 00 	lea    r12,[rip+0x200170]        # 600648 <__frame_dummy_init_array_entry>
  4004d8:	48 89 5c 24 d0       	mov    QWORD PTR [rsp-0x30],rbx
  4004dd:	4c 89 6c 24 e8       	mov    QWORD PTR [rsp-0x18],r13
  4004e2:	4c 89 74 24 f0       	mov    QWORD PTR [rsp-0x10],r14
  4004e7:	4c 89 7c 24 f8       	mov    QWORD PTR [rsp-0x8],r15
  4004ec:	48 83 ec 38          	sub    rsp,0x38
  4004f0:	4c 29 e5             	sub    rbp,r12
  4004f3:	41 89 ff             	mov    r15d,edi
  4004f6:	49 89 f6             	mov    r14,rsi
  4004f9:	48 c1 fd 03          	sar    rbp,0x3
  4004fd:	49 89 d5             	mov    r13,rdx
  400500:	31 db                	xor    ebx,ebx
  400502:	e8 51 fe ff ff       	call   400358 <_init>
  400507:	48 85 ed             	test   rbp,rbp
  40050a:	74 1a                	je     400526 <__libc_csu_init+0x66>
  40050c:	0f 1f 40 00          	nop    DWORD PTR [rax+0x0]
  400510:	4c 89 ea             	mov    rdx,r13
  400513:	4c 89 f6             	mov    rsi,r14
  400516:	44 89 ff             	mov    edi,r15d
  400519:	41 ff 14 dc          	call   QWORD PTR [r12+rbx*8]
  40051d:	48 83 c3 01          	add    rbx,0x1
  400521:	48 39 eb             	cmp    rbx,rbp
  400524:	75 ea                	jne    400510 <__libc_csu_init+0x50>
  400526:	48 8b 5c 24 08       	mov    rbx,QWORD PTR [rsp+0x8]
  40052b:	48 8b 6c 24 10       	mov    rbp,QWORD PTR [rsp+0x10]
  400530:	4c 8b 64 24 18       	mov    r12,QWORD PTR [rsp+0x18]
  400535:	4c 8b 6c 24 20       	mov    r13,QWORD PTR [rsp+0x20]
  40053a:	4c 8b 74 24 28       	mov    r14,QWORD PTR [rsp+0x28]
  40053f:	4c 8b 7c 24 30       	mov    r15,QWORD PTR [rsp+0x30]
  400544:	48 83 c4 38          	add    rsp,0x38
  400548:	c3                   	ret    
  400549:	0f 1f 80 00 00 00 00 	nop    DWORD PTR [rax+0x0]

0000000000400550 <__libc_csu_fini>:
  400550:	f3 c3                	repz ret 
  400552:	66 90                	xchg   ax,ax

Disassembly of section .fini:

0000000000400554 <_fini>:
  400554:	48 83 ec 08          	sub    rsp,0x8
  400558:	48 83 c4 08          	add    rsp,0x8
  40055c:	c3                   	ret    
-------------- next part --------------
		.intel_syntax	noprefix

		.global		function

		.code64

function:

		ret


-------------- next part --------------
A non-text attachment was scrubbed...
Name: main.c
Type: text/x-csrc
Size: 117 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc/attachments/20121012/371aaae4/attachment.bin>


More information about the Gcc mailing list