3 ms·
> That can't be true. Lol. See for yourself if you don't believe me. https://godbolt.org/z/o14f7cdsc https://godbolt.org/z/o14f7cdsc > Why would a compiler u
by chrisseaton 4y ago
> That can't be true.
Lol. See for yourself if you don't believe me.
https://godbolt.org/z/o14f7cdsc https://godbolt.org/z/o14f7cdsc
> Why would a compiler use memory access to do math?
Because there are efficient instructions for it. Have you written an arithmetic code generation pass? It's normal to do it like this.
> Math operations are register based, none of the quantities are addresses.
An address is just a number. Yeah they're in registers or can be immediate. So what?
> How can you use memory addressing modes to do math, like 987*765?
Because AMD64 addressing modes have a base, a scale, and an offset component. That's multiplying and adding.
Let me know how you think you can work out if that lea overflowed!
- mikewarot 4y agoWow, that's nuts. I'd have never expected that abuse. You can use -ftrapv to check for integer overflows, like this https://godbolt.org/z/snbdadv8b https://godbolt.org/z/snbdadv8b >Let me know how you think you can work out if that lea overflowed! LEA (Load Effective Address) can't overflow... memory is supposed to wrap, the byte after the last byte is byte 0.
- chrisseaton 4y agoRight but have you seen what that’s done to your machine code? That’s why people don’t do it normally. > LEA (Load Effective Address) can't overflow... You're mistaken - it's defined to overflow. https://reverseengineering.stackexchange.com/questions/11442/understanding-subtle-differences-between-addressing-modes-in-x86 https://reverseengineering.stackexchange.com/questions/11442...
- zorgmonkey 4y agoI'm not 100% sure, but I think that the behavior of LEA is to wrap, but it does not set the overflow flag