x86 assembly has many addressing schemes and a significant amount of historical baggage, even from its inception.
It's up to the compiler/programmer to handle calling conventions.
Modern programmers also don't regularly encounter "unstructured programming" in higher-level languages these days.
All of these, and more, make it feel overwhelming, as anything they examine through their disassembler will contain all of these elements.