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.