France started strong, grabbing an early lead through a Kylian Mbappé assist headed in by Randal Kolo Muani. But Mbappé, playing without his protective mask for the first time since a broken nose, couldn't prevent Spain's comeback.
Yamal's moment of brilliance arrived in the 21st minute with a stunning curled effort from 25 yards that beat Mike Maignan and nestled in the net.
Just four minutes later, Dani Olmo's shot took a deflection off Jules Koundé, putting Spain ahead. (The goal was initially credited as an own-goal but later awarded to Olmo.)
Despite dominating possession in the second half, France failed to convert their chances. Theo Hernandez and Mbappé both missed opportunities, while Yamal nearly extended Spain's lead with another powerful strike that sailed just over the bar.
Spain will now face the winner of the England vs. Netherlands match in the Euro 2024 final on Sunday in Berlin.
Fulham
Newcastle
Liverpool
Brentford
Burnley
Wolves
Chelsea
Tottenham
Bournemouth
Manchester City
Arsenal
Valencia
Barcelona
Celta Vigo
Sevilla
Espanyol
Real Sociedad
Real Betis
Atletico Madrid
Girona
Athletic Club
Fiorentina
Atalanta
Bologna
Inter
Lazio
Pisa
Sassuolo
Lecce
Cagliari
Torino
Udinese
Cremonese
VfL Wolfsburg
SC Paderborn 07
Lille
Auxerre
Lyon
Lens
Marseille
Rennes
FAR Rabat
Mamelodi Sundowns