[kohlrak@kohlrak-server temp]$ cat main.cpp #include #include int main(int argc, char **argv){ int le = atoi(argv[1]), be; //For the sake of example, we'll just assume the user will send us the correct number of params. be=le; asm("bswap %1":"=r"(be):"r"(be):); //Thank you gcc, for making this task more difficult than necessary. If i used compiler output, i'd just "bswap [be]" printf("LE: 0x%08x\nBE: 0x%08x\n", le, be); return 0; } [kohlrak@kohlrak-server temp]$ cat main.s .file "main.cpp" .intel_syntax noprefix .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "LE: 0x%08x\nBE: 0x%08x\n" .section .text.startup,"ax",@progbits .globl main main: lea ecx, [esp+4] and esp, -16 push DWORD PTR [ecx-4] push ebp mov ebp, esp push ecx #begin atoi(argv[1]) sub esp, 8 mov eax, DWORD PTR [ecx+4] push 10 push 0 push DWORD PTR [eax+4] call strtol add esp, 12 #end atoi(argv[1]) bswap eax #convert result of atoi(argv[1]) from Little-endian to big-endian. Surprise, the CPU has an instruction to do this that the compiler was *not* using! push edx push eax push OFFSET FLAT:.LC0 call printf mov ecx, DWORD PTR [ebp-4] add esp, 16 #delete variables xor eax, eax #set 0 for returning leave #delete other variables lea esp, [ecx-4] ret #return