Software-oriented approaches for teaching computer architecture to computer science students