Ok, here goes:
1) Your program changes laser to 1 when spacekey()=1, which is all well and good. But the problem is that later on, you have it saying "if dir=0 and laser=1 then right_shoot". The problem here is that laser=1 for as long as the laser is shooting, and this line is run every loop. Therefore whenever you loop, the program is making your laser move the same direction as your player like I guessed it was.
What you need to do is set the laser direct _once_ instead of every loop, which you do by making the if spaceky()=1 and laser=0 bit an endif instead of a simple end statement, and making it check the direction then only. Look at the fixed code below if you don't understand, I'm not very good at exlaining these things.
2) Like I guessed, whenever the spacekey is down and the laser is moving the program plays the sound. You only want it to play once, so you need to use a flag like I suggested. Code below should work...
IF SPACEKEY()=1 AND laser=0
laser=1:
if dir=0 then right_shoot=1
dir=1 then left_shoot=1
show sprite 2
ENDIF
IF SPACEKEY()=1 AND laser=1 AND spaceDown=0 THEN PLAY SOUND 1:spaceDown=1
if spacekey()=0 then spaceDown=0
IF right_shoot=1 THEN xlaser=xlaser+20
IF left_shoot=1 THEN xlaser=xlaser-20
IF right_shoot=1 AND dir=1 THEN xlaser=xlaser+20
IF left_shoot=1 AND dir=0 THEN xlaser=xlaser-20
IF xlaser>640 THEN laser=0
IF xlaser<0 THEN laser=0
Why do you sink I ave zees outRAGEOUS accente?!