1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
#include <stdio.h>
typedef unsigned long long int ULong;
typedef unsigned int UInt;
ULong arg64, res64;
extern void foo64 ( void );
asm("\n"
"foo64:\n"
"\tpushq %rcx\n"
"\tmovq $0, %rax\n"
"\tmovq arg64, %rcx\n"
"Lagain64:\n"
"\taddq $177, %rax\n"
"\tdecq %rcx\n"
"\tjrcxz Lout64\n"
"\tjmp Lagain64\n"
"Lout64:\n"
"\tmovq %rax, res64\n"
"\tpopq %rcx\n"
"\tret\n"
);
UInt arg32, res32;
extern void foo32 ( void );
asm("\n"
"foo32:\n"
"\tpushq %rcx\n"
"\tmovq $0, %rax\n"
"\tmovl arg32, %ecx\n"
"Lagain32:\n"
"\taddq $177, %rax\n"
"\tdecl %ecx\n"
"\tjecxz Lout32\n"
"\tjmp Lagain32\n"
"Lout32:\n"
"\tmovl %eax, res32\n"
"\tpopq %rcx\n"
"\tret\n"
);
int main ( void )
{
arg64 = 100;
res64 = 0;
foo64();
printf("%lld\n", res64);
arg32 = 1234;
res32 = 0;
foo32();
printf("%d\n", res32);
return 0;
}
|