2016-04-15 13 views
-4

Warum können wir einen Speicheroperanden auf diese Weise in ein Segmentregister verschieben, indem wir eine MOV Anweisung in der x86-Assemblersprache verwenden?Warum sind mov ds, [bx] und mov ds, [2345H] gültig?

Warum sind diese gültig?

Mov DS,[Bx] 

Mov DS,[2345H] 
+0

es ist ein Maschinencode. MOV ist Maschinenbefehl. –

+0

Warum sollten sie nicht sein? 'MOV Sreg, r/m16' ist im internen Referenzhandbuch aufgeführt. Die Maschinencodecodierung verwendet nur das normale mod/rm-Byte, um zu ermöglichen, dass die Quelle ein Register oder Speicheroperand ist. Siehe das [x86-Tag-Wiki] (http://stackoverflow.com/tags/x86/info) für Links zum Handbuch. –

+4

Ich stimme, diese Frage als off-topic zu schließen, weil es keinen Wert für zukünftige Leser gibt. Das Handbuch beantwortet die ganze Frage vollständig, also nur RTFM. –

Antwort

2

Da dies gültige Formen der MOV-Anweisung sind. Der MOV-Befehl ermöglicht folgende Bewegungen (ich bin bewegt zu/von Steuerung und Debug-Register weggelassen, siehe CPU Handbücher für weitere Details):

general-purpose register <- integer constant 
memory <- integer constant 

general-purpose register <- general-purpose register 
memory <- general-purpose register 
general-purpose register <- memory 

segment register <- general-purpose register 
segment register <- memory 
general-purpose register <- segment register 
memory <- segment register 

Die CPU nicht die folgenden Schritte mit dem MOV-Befehl unterstützt:

Wenn Sie sich fragen, warum, vereinfacht es Dinge in der CPU. Es gibt weniger unterschiedliche Anweisungen, die die CPU dekodieren muss, und in ähnlicher Weise gibt es weniger mögliche Operandenkodierungen. Es ist wahrscheinlich, dass es auch weniger spezielle Fälle gibt, die behandelt werden müssen, wenn eine Anweisung auf höchstens einen Speicherplatz zugreifen kann. Und die meisten Anweisungen sind so. Dies macht das Design einfacher und die CPU billiger. Es gibt ein paar Anweisungen, die auf zwei Speicherstellen zugreifen können, aber sie sind sehr spezialisiert und ihre Speicherstellen sind nicht sehr flexibel (sie sind an bestimmte Register gebunden). PUSH und POP können Daten zwischen Speicher und Stapel verschieben (Stapel ist Speicher). MOVSB ​​/ MOVSW/MOVSD verschiebt Daten aus dem Speicher bei DS: (E | R) SI in den Speicher bei ES: (E | R) DI.

Ihr Assembler lässt Sie nicht MOV WORD [BX], [SI] weil es weiß, dass die CPU es nicht tun kann, hat die CPU einfach keine solche Anweisung. Das ist alles, was es für dich jetzt darüber zu wissen gibt.