well c++ is the flavour for games at the moment. Assembly is useful but not a necessity. Its the case now that most compilers can optimize your code far better than you could do when writting your own assembly code. Unless your an old skool programmer. Consequently with c++ you would choose directx or opengl, doesnt matter which really. Opengl is probably easier though, which is a good thing if your going to produce a physics engine, your not really concerned with the complex graphics side of things.
I would suggest you build something that simulates simple newtonian physics (2 pool balls and a perfect collision, then move to more complicated things). After you’ve got a solid grounding in that move onto more complicate things.
Although you dont really have to build your own physics end from scratch theres plenty of them out there. ODE is a great one and used in a few commerical games, good documentation also.
Basically i would suggest dont be ambitious or you wont finish it. Build it so you can do something small each time(add 1 extra piece functionality) that way your always making progress. Also an old bit of S\W engineering would be useful in the engine, seeing as your studying that.
good books are beginning opengl\directx3d.
andre le mothe’s tricks I & II
advanced directx etc.
best of luck