35 ms·
If I run the fib example on a Linux 64bit install and forget the -m32 flag (both GCC and Clang) it will return 0 for each call (the earlier return 42 example wo
by rdc12 12y ago
If I run the fib example on a Linux 64bit install and forget the -m32 flag (both GCC and Clang) it will return 0 for each call (the earlier return 42 example worked thou), add the flag and it works. Curious to know what change caused that?
- hansw2000 12y agoIt's because of the difference in how arguments are passed to functions in 32-bit vs 64-bit mode. In the System V AMD64 ABI, the first integer argument to a function is passed in the rdi register. The fib function however, being written for 32-bit mode, is expecting the argument on the stack, and loads it from esp+4, so it gets a garbage value. The value on the top of the stack is the return address, which is probably somewhere around 0x0000000000400000 (the default entry point). Loading from esp+4 gets the high bits which are all zeros, so that's what goes into %ecx. If you build the program as a position-independent executable (gcc -fpic -pie), it will get loaded at a random address and it will print a different value.
- rdc12 12y agoAs soon as I read that, it was an o of course moment, especially with the time the orginal author spent talking about the ABI. Cheers