| .text |
| .globl _start |
| .type _start,@function |
| .p2align 4 |
| _start: |
| xorl %ebp, %ebp |
| #ifdef __LP64__ |
| popq %rdi |
| movq %rsp, %rsi |
| andq $~15, %rsp |
| #elif defined __x86_64__ |
| mov (%rsp),%edi |
| addl $4,%esp |
| movl %esp, %esi |
| andl $~15, %esp |
| #else |
| popl %esi |
| movl %esp, %ecx |
| andl $~15, %esp |
| |
| subl $8,%esp |
| pushl %ecx |
| pushl %esi |
| #endif |
| |
| call main |
| |
| hlt |
| |
| .type syscall, @function |
| .globl syscall |
| .p2align 4 |
| syscall: |
| #ifdef __x86_64__ |
| movq %rdi, %rax /* Syscall number -> rax. */ |
| movq %rsi, %rdi /* shift arg1 - arg5. */ |
| movq %rdx, %rsi |
| movq %rcx, %rdx |
| movq %r8, %r10 |
| movq %r9, %r8 |
| movq 8(%rsp),%r9 /* arg6 is on the stack. */ |
| syscall /* Do the system call. */ |
| #else |
| push %ebp |
| push %edi |
| push %esi |
| push %ebx |
| mov 0x2c(%esp),%ebp |
| mov 0x28(%esp),%edi |
| mov 0x24(%esp),%esi |
| mov 0x20(%esp),%edx |
| mov 0x1c(%esp),%ecx |
| mov 0x18(%esp),%ebx |
| mov 0x14(%esp),%eax |
| int $0x80 |
| pop %ebx |
| pop %esi |
| pop %edi |
| pop %ebp |
| #endif |
| ret /* Return to caller. */ |
| .size syscall, .-syscall |
| .section .note.GNU-stack,"",@progbits |
| |
| .section ".note.gnu.property", "a" |
| #ifdef __LP64__ |
| .p2align 3 |
| #else |
| .p2align 2 |
| #endif |
| .long 1f - 0f /* name length */ |
| .long 5f - 2f /* data length */ |
| .long 5 /* note type */ |
| 0: .asciz "GNU" /* vendor name */ |
| 1: |
| #ifdef __LP64__ |
| .p2align 3 |
| #else |
| .p2align 2 |
| #endif |
| 2: .long 0xc0000002 /* pr_type. */ |
| .long 4f - 3f /* pr_datasz. */ |
| 3: |
| .long 0x2 |
| 4: |
| #ifdef __LP64__ |
| .p2align 3 |
| #else |
| .p2align 2 |
| #endif |
| 5: |