Your maths seemed alright when you were calculating the pulses per unit. I assume your unit is millimeters. You are saying your motors are 200 steps per rev and the drivers are set to 1/2 steps. Therefore your motor will need 400 pulses to turn one rev and one rev of the motor turns the shatf forward by 1 mm - so you are correct - 400 is your answer - but you seem to be saying your axis is moving 8 mm instead of 5 mm when you put in GCode.
There can be many reasons for that, because Mach3 can take into account all sorts of offsets, so move the axis from 0 to 10 first, then move from 10 to 20 - measure the second movement - which should be 10 mms. This should be correct. Do not come back, or you will have to take into account backlash - which is another problem.
With your switches, you must understand the difference. LIMIT switches are what they say. They limit the movement of the axis, and, as such, however they are activated, should stop the axis dead. There are various settings that then allow you to back off the switch to get going again. (There are excellent videos to watch which explain all this)
HOME switches are different. As Hood said you can have the same switch act as a LIMIT switch and also as a HOME switch - the computer switches off the "LIMIT" action if it is using it as a home switch. The way a "HOME" switch works is that the computer will run the axis up to the home switch. The switch then switches and stops the axis. The computer then reverses direction and moves the axis off the switch untill it opens (or closes) again, then stops. The computer can, then, set the Digital Read Out's for the axis at 0 if you wish (or at any other figure). The computer then knows exactly where the machine is, and can compute all it's next moves from there.
You will find fitting and setting up Limit and Home Switches quite tedious. Home switches must be accurate. The way to test these is to home the axis, then knock off the auto zero facility and try homing the switch again a few times. The answer should always be 0 of course, but it is a test of your machine to see if that is actually the case. A few thous might be a more realistic answer.
I do not bother with limits or homes on my lathe - which I set up for each job - and I am staisfied then that it is accurate.
My lathe also has a milling head, and whilst I do not do too much milling, I prefer to set each job off from a know position, usuallly the bottom left hand corner of the job, with Z resting on the work.
Since I am not trying to run off thousands of parts, this satisfys me, but each to his own!!