Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- [kohlrak@kohlrak-server temp]$ cat main.cpp
- #include <stdio.h>
- #include <stdlib.h>
- 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
Advertisement
Add Comment
Please, Sign In to add comment