Dando una rapida lettura mi viene da dire che intanto xor reg,reg azzera il registro cosa che nel tuo codice viene eseguito anche cn un mov. Presi singolarmente andrebbero bene ma in sequenza fanno numero e accodano errori. Riduci le lunghezze 2 volte. Tocca riordinare un po i diversi jumps che fanno rabbrividire anche le ottimizzazioni del gcc. Il flusso oltre ad essere molto contorto veramente dubito ti trovi qualcosa. Ripetoho letto molto velocemente