| 

.NET C# Java Javascript Exception

1
Was berechnet das folgende Assemblerprogramm:
Hier der Code:

MOV AX, 0 //Null in das Register AX schreiben
CMP CX,0 //Vergleiche CX mit 0
nochmal: JZ ende //Springe bei NULL zur Label Marke "ende"
ADD AX,CX //Übersprungen wenn vergleich NULL ergibt, ansonsten CX zu AX hinzufügen
DEC CX //Decrement, verringere CX um einen!
JMP noch mal //Springt zu einem nicht vorhandenen Label (Da Leerzeichen enthalten)
ende: NOP //NOP <-> Nichts halt!


Es stimmt doch das man immer den rechten Wert in das linke Register schiebt oder ?

Ich würde sagen das Programm kontrolliert ob CX 0 ist, wenn dem nicht so ist Addiert es den Wert von CX in AX und zieht einen von CX ab!
Der JMP Befehl ist durch das Leerzeichen ungültig oder ?

Viele Dank für die Hilfe :)
News:
07.09.2009
cyby 142 1 5
5 Antworten
1
Hi,

Ja. Bei Befehlen mit 2 Parametern ist der erste in der Regel (kenne keine Ausnahme) das Ziel und der Zweite die Quelle. Dies kopiert also den Wert von CX in das Register AX.

mov ax,cx


Der Code selbst sieht wie eine Multiplikation AX = AX*CX aus - deine Beschreibung stimmt also.

Der JMP Befehl sollte - wie du geschrieben hast - nicht funktionieren, da es

JMP nochmal


heissen sollte.
07.09.2009
thomas richter 36 1 1
Vielen Dank für die schnelle Antwort!

Stimmt, den Multiplikatoreffekt habe ich zwar durch die Addition gegeben (Insofern das Label nochmal stimmen würde ;))- aber gar nicht beachtet in meiner Betrachtung! :)

cyby 07.09.2009
2
Vielleicht habt ihr übersehen, dass CX in der Schleife heruntergezählt wird.

Deswegen ist es keine Multiplikation.

Für CX=5 wäre zum Beispiel das Ergebnis in AX= 5+4+3+2+1
07.09.2009
LostMind 41 1 1
Jep, ist mir eben auch aufgefallen & da AX immer auf NULL gesetzt wird findet hier nur die Addition statt! ;)
Hatte das gerade mal auf dem Papier mit Werten durchlaufen lassen!
cyby 07.09.2009
1
Da Du hier nicht angibst um was für einen Assembler und um was für eine Zielarchitektur es sich handelt ist manches schwierig zu beantworten.

Das immer auf den linke Operanden geschoben wird muss nicht stimmen. Wenn Du einen Assembler mit gas-Syntax benutzt, schreibt man beispielsweise auf den linken Operanden!
movb $0x05, %al


Mir ist kein Assembler bekannt, der ein Leerzeichen in einem Label erlauben würde. Deine Beschreibung ist korrekt, wie auch mein Vorgänger schon geschrieben hat. Aber eine Multiplikation findet hier natürlich nicht statt!
07.09.2009
arj 21 1 1
arj 21 1 1
Tja, dies habe ich auch alles nicht gegeben!
Denke eine i386 System - aber es steht nichts dabei ;) Ist ne Probeklausur muß nochmal die Beispiele ansehen!

Danke :)
cyby 07.09.2009
1
Achtung nicht bei allen Prozessoren stimmt diese Reihenfolge (Ziel, Quelle). Bei Freescale wäre es z.B. genau anderes herum.
07.09.2009
Blue_lord 21 1 2
Danke - gut zu wissen!
Kenne es nur von rechts nach links!
(8085 oder so habe ich damals programmieren müßen ;))

Ich denke das sich der Code auf einen i386 Rechner bezieht! Aber müßte mir noch mal die Beispiele ansehen!

Er hat leider keinerleih Angaben gemacht zu dem System/zu der Zielarchitektur!
cyby 07.09.2009
0
OK - habs jetzt ;)
In den Beispielen ist es so wie oben beschrieben!
Also von rechts die Werte in die linken Register!

:)

Danke für die schnelle und effektive Unterstützung :)
*Der Besuch dieser Seite über heise.de hat sich gelohnt :);)*
07.09.2009
cyby 142 1 5

Stelle deine Assembler.asm-Frage jetzt!