wenn ich im Compiler Register Variables auf none stelle, dann funktioniert es auch.
Ist das zufall oder hat hier der Compiler meine Variable geschreddert?
Eher umgekehrt. Wenn du dem Compiler sagst, er kann Register für Variablen und Zwischenergebnisse verwenden, dann musst du auch mit ihm darüber kommunizieren, wer wann welche Register wofür verwendet. DX und AX werden eigentlich immer als "enthalten irgendwas was man in dem Moment berechnet" verwendet, also fast nie um längere Zeit irgendwelche Variablen aufzubewahren. Die kannst du in asm-Blöcken ziemlich hemmungslos verwenden.
Der asm-Code von XMScopy verändert aber auch BX (eigentlich nur BL) und geht davon aus, dass SI auf irgendeinen Speicherbereich zeigt, in dem du deine EMM Structure zusammenbauen kannst. Das ist schlecht. Dein asm-Code sollte mit PUSH BX und PUSH SI anfangen und mit POP SI und POP BX aufhören, damit er nicht BX und SI verändert, die vielleicht gerade vom Compiler anderen Zwecken zugewiesen worden sind.
Zusätzlich solltest du DS und SI auf einen Ort zeigen lassen, von dem du SICHER weisst, dass du dort deine EMM Structure hinschreiben darfst. Sonst kann DS:[SI] bis inkl. DS:[SI+15] (oder in Borland Stil: word ptr 14[SI] irgendwelche völlig anderen Daten oder sogar Code enthalten, die du jedes Mal zerstörst, wenn du XMScopy benutzt.
Du könntest zum Beispiel einen Array von acht 16-Bit Worten namens EMMstructure anlegen, wahlweise global oder auf dem Stack, und dann in deinem asm-Block DS und SI auf die Adresse dieses Arrays einstellen. Je nach Speichermodell musst du zusätzlich unbedingt darauf achten, dass der Compiler die Segmente nicht durcheinanderbringt.
Aktuell erwähnst du für XMStest, XMSfehler und die ganzen an XMScopy übergebenen Sachen nie ein Segment und für die Struktur ab DS:SI auch nicht. Also nimmst du wahrscheinlich an, dass sie alle im gleichen Segment sind. Das funktioniert nur in einem Speichermodell, in dem fast alle Variablen near sind und sich mit dem Stack die gleichen 64 kB teilen. Vielleicht kümmert sich auch der Compiler selbst teilweise darum, indem er deinen asm-Code um passende DS: oder ES: oder SS: Angaben ergänzt, aber wie Borland das handhabt, weiss ich nicht. Jedenfalls muss deine Struktur auf DS:SI entweder so liegen, dass sie das gleiche DS hat wie XMStest, XMSfehler und die Argumente von XMScopy, oder du müsstest überall explizit mit den verschiedenen Segmenten umgehen und ein PUSH DS und POP DS am Anfang und Ende von deinem asm-Block ergänzen.
Ich würde dir sehr empfehlen, den ganzen Zirkus rund um die EMM Structure in den C-Anteil von XMScopy zu verschieben. Also ganz gemütlich die komplette EMM Structure in C produzieren und dann dem asm-Block nur noch die Adresse der EMM Structure übergeben statt der vielen kleinen Variablen die du jetzt alle einzeln in Assembler dort rein bastelst. Das in C zu machen spart eine Menge Stress und potentieller Bugs.