2016-07-20 25 views
0

Referenz: reference Frage: questionAssembly Language Anweisung in Maschinensprache Anweisung

Ich bin nicht die gleichen Werte erhalten, wie sie in ihrer Antwort zu tun.

Der Opcode für ld (sofort) ist 0x31 = 0011 0001 Der Wert ist 0x10A = 0001 0000 1010. Ich weiß nicht, wie man macht die Ri hier registrieren.

Das physikalische Format für LD (0x31) ist zwei Wörter lang.

Wort 1: Bits 7-2 sind für den Opcode. Daher wird die Binärsequenz für ld auf 110001 Bits verkürzt.

Bits 1-0 sind für Ri.

Wort 2: Alle 8 Bits für Werte reserviert

10A = 0001 0000 1010 0000 1010 ... verkürzt wird? Was ist mit der 0001? :(

Mein Ergebnis - 1100 01 Ri 0000 1010.

Antwort

1

ist in der Dokumentation der Suche in der Frage enthält, gibt es mehrere Hinweise, die vorgeschlagen werden. Die Maschine hat vier 8-Bit-Register, die mit R0, R1, R2 und R3 nummeriert sind, die unter Verwendung von zwei Bits adressiert werden.

Die Op-Codes für die Anweisungen sind in der Dokumentation als zwei Hexadezimalziffern angegeben. In der tatsächlichen Implementierung ist der Operationscodebereich der Befehle jedoch nicht zwei Hexadezimalstellen groß, so dass Sie den Hexadezimalwert nehmen und den Wert um 2 Bits nach links verschieben müssen. So wird ein Op-Code für eine Ladung von 0x30 (00110000) nach links verschoben, was zu 0xC0 (11000000 in binär) führt, oder der Op-Code für einen Speicher von 0x32 (00111010) wird nach links verschoben, was zu 0xC8 (1100-1000) führt Eine Registernummer von Null bis Drei wird in die unteren zwei Bits der zwei Hexadezimalziffern eingefügt.

Der Befehl zum Laden von Adressen lautet ld Ri,xxxx, wobei xx eine 16-Bit-Adresse des Speicherorts ist, der den 8-Bit-Wert enthält, der in das Register geladen werden soll. Dieser Ladebefehl setzt das spezifizierte 8-Bit-Register (R0, R1, R2 oder R3) mit dem 8-Bit-Wert an der spezifizierten Adresse.

Die tatsächlichen Bitformate für den Ladebefehl sind: (1) Opcode (0x30) in den höchstwertigen 6 Bits, gefolgt von (2) der Registernummer (0-3) in den nächsten zwei Bits, gefolgt von (3) ein 16-Bit-Wert, der eine Adresse zu dem zu ladenden Wert ist. Die sollte dann wie 1100 0001 0000 0001 0000 1010 im Binärformat aussehen, die sich als 1100 00 als Op-Code 0x30, 01 als Registernummer R1 und 0000 0001 0000 1010 als 0x010A ausscheiden.

Die Last sofort ld R3,$-12 wie 1100 0111 1111 0400 -12 aussehen sollte, ist 0xFFF4

Die add R1,R3 wie 0100 0001 1100 0000 aussehen sollten die nicht verwendeten Bits werden auf Null gesetzt angenommen wird. Dies wäre 010000 als der 0x10-Operationscode für Add, 01 für das Register R1 und 11 für das Register R3. Die verbleibenden 6 Bits in dem zweiten 8-Bit-Teil des Addierbefehls werden nicht verwendet und ignoriert.

Die sto R1,0x10B sollte wie 1100 1001 0000 0001 0000 1011 aussehen, das ist der Op-Code von 0x32, Register 1, der unter der 16-Bit-Adresse von 0x010B gespeichert wird.

2

Ja die Antwort im Bild ist falsch, das ist für 0x10D nicht 0x10A Yours auch falsch ist

Für den Anfang ld hat zwei Versionen.. eine für die Speicherlast und eine für die konstante Last. Die in der Frage ist die Speicherlast, und das hat Opcode 0x30. Ri ist nur die Registernummer für den Operanden, und das ist eindeutig 1 hier. So sieht das erste Byte aus 1100 0001 (Dies ist im Bild korrekt). Dann müssen Sie nur die Konstante hinter es als zwei Bytes setzen, Big Endian.

Also, die richtige Antwort 1100 0001 0000 0001 0000 1010

+0

Danke nochmal Jester, es ist klar, dass ich direkte und direkte Adressmodi aus dem Bild verwechselt habe –