| |
| #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; |
| } |