Assembler?
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
akku
assembler
ausgabe
befehl
berechnung
code
eins
ergebnis
formatierung
funktion
http
jemand
keil
looping
programm
programmieren
schleifen
teil
zahl
zeichen
-
Hi, ist einer da der Assemlber kann? Ich stelle diese frage jetzt einfach mal so in den Raum. Ich muss f?r die Schule ein Programm entwerfen welches die Fakult?t ausgibt :/
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
hm, ich kann zwar kein Assembler, aber ich denke das ist in allen Programmiersprachen ungef?hr gleich.
x=4
Variable, die die Fakult?t darstellen, soll initialisieren.
for(i=(x-1);i!=0;i--)x=x*i;
For Schleife, die immer um 1 runterz?hlt und dann diesen wert mit dem vorherigen multipliziert.
Und anschlie?en musst du den Wert ausgeben.
4! = 24 -
assebler ist noch was komplizierte als das was du da angibst bladhunter!!
bin schon zwei mal durch die d?mliche pr?fung gefallen.
in assambler arebitest du mit registern und son mist!! -
gibt es in Assembler ?berhaupt sowas wie for-Schleifen ?
-
Jo, is nur nen bisschen anders.
So einfach erkl?ren kann ich das zwar jetzt auch nicht, aber ich kann mal nachgucken. Endlosschleifen gehen auf jeden Fall, hab ich schon mal an den Schulrechnern ausprobiert .
AlienDwarf -
Hier meldet sich ein Assembler-Programmierer!!
Zum programmieren einer For-Schleife wird der Akku mit der Anzahl der Durchl?ufe geladen z.B.: MOV A,#5
Dann wird mit JZ die Abfrage gestellt ob der Akku Null ist
z.B.: JZ Loop_End
Bei jeden Durchlauf den Akku-1 vermindern
DEC A
HaloF Str?bi
EDIT 0-checka:
Nachfolgende Zitate sind jeweils Postings (Mehrfachposting), die von mir in diesen Beitrag editiert worden sind. N?chstes Mal bitte die Edit-Funktion benutzen!
Und vergesst nicht Assembler ist Maschinensprache und keine hohe Programmierspareche wie Java.
Assembler kann auch in C programmiert werden!!
Wir programmieren in der Schule den MicroProzessor 8051.
Im wessentlichen werden Werte von eingangsports eingelsen ?ber Register bearbeitet und auf Ports an z.B.: externen Speicher ausgegeben!
Bei der berechnung der Fakult?t wird das Multiplizieren mittels des Befehls MUL AB durchgef?hrt wobei der eine Faktor auf den Akku(A) geladen wird
MOV A,#5 und der andere auf den Ersatzakku B gespeichert MOV B,#4
dann MUL AB und auf dem Akku befindet sich dann das Ergebniss!!
Wenn ihr mehr zum Assembler wissen wollt schickt mir ein E-Mail an stroebi6@gmx.at!!
Ich benutze zum programmieren den Editor Keil u3 --> der beste Editor!!!
-
stroebi schrieb:
Ich benutze zum programmieren den Editor Keil u3 --> der beste Editor!!!
hm, wo kann man den runterladen ?
und wo gibt es ein gutes tut f?r besonders bl?de newbies wie mich -
Weis nicht ob Keil u3 Freeware ist aber glaub schon!!
Aber d?rfte kein Probelm sein im Google zu finden!
edit jacr
Benutz die Edit funktion.
Habe aus zwei Beitr?gen einen gemacht. -
Ich glaube das du eine CMP (Compare Funktion brauchst) die setzt dann das ZERO Flag wenn die Werte gleich sind (verglichen werden sollten z?hlervariable und Konstante). Dann kommt ein ZJMP Befehl spring an die Folgende Adresse wenn Zero flag gesetzt ist.
Gutes Tutorial + Assambler
http://flatassembler.net/
Alles freeware (opensource)
mfg
edvo -
Hallo bladehunter!
Gibt es in Assembler ?berhaupt sowas wie for-Schleifen?
Das h?ngt vom Prozessor-Typ ab. Zilog-Prozessoren unterst?tzen seit der 16-Bit-Version Z8000 Befehle, die for-Schleifen extrem einfach in Assembler realisierbar machen:
z.B.: LDIR : Load, Increment and Repeat
Zum Thema:
Der p?dagogische Wert der Fakult?t ist der, dass dem "Lernenden" die Notwendigkeit der rekursiven Programmierung nahe gebracht wird. Dies l?sst sich am einfachsten ?ber ein Unterprogramm realisieren. Denn die mathematische Definition der Fakult?t ist eine rekursive:
1! wird festgelegt auf 1.
2! = 2 x 1! = 2 x 1
3! = 3 x 2! = 3 x 2 x 1
...
Abstrakt gesprochen: n! = n x (n-1)!
Man muss also nur ein Unterprogramm schreiben, dass sich selbst aufruft, und dabei einen ?bergebenen Parameter jedesmal um Eins erniedrigt. Kommt man bei Eins an, kann man Eins zur?ckgeben (siehe Definition).
Ich hab sowas mal schnell in PHP gezimmert. Ich wei?, das ist kein Assembler, aber es verdeutlicht die Idee, die dahinter steckt:
<?php
print("Fakult?t<br />\n");
$zahl = 4;
$zahl2 = fak($zahl);
printf("Die Fakult?t von %s ist %s!<br />\n", $zahl, $zahl2);
function fak($x) {
//printf("Berechne: %s<br />\n", $x);
if($x == 1) return(1);
$y = fak($x - 1);
return($x * $y);
}
?>
MfG
alopex
-
Weil ich mal wissen wollte, ob ich's noch hinkriege. Nicht erschrecken, der gr?sste Teil des Codes ist nur f?r die Ausgabe des Ergenisses vorhanden.
Das hier ist allerdings nur eine quick&dirty-L?sung. Der Wert f?r N muss am Anfang des Programms "festverdrahtet" werden, weil ich nicht noch eine Eingabe einbauen wollte. Der Algorithmus zur Berechnung der Fakult?t funktioniert hier auch nur max. f?r Ergebnisse unter 2^16, weil Overflows bei der Multiplikation nicht abgefangen werden....Dieses Beispiel funktioniert mit tasm von Borland, f?r andere Compiler m?sste man evtl. Anpassungen vornehmen. Achja -- und es l?uft nat?rlich nur unter Dos bzw. Eingabeaufforderung :)
.286
.model small
.stack 100h
.code
N EQU 8 ; Die Variable n zur Berchnung von n!
;Ausgabe eines Zeichens (ASCII-Code in AL)
PUTCHAR PROC FAR
PUSHF
PUSHA
MOV DL,AL
MOV AH,00FH
INT 010H ;aktuelle Seite in BH lesen
MOV BL,00FH
MOV AH,00EH
MOV AL,DL
INT 010H ;Zeichen schreiben
POPA
POPF
RET
PUTCHAR ENDP
;Ausgabe eines Bytes in AL (als zwei Hex-Zeichen)
PUTBYTE PROC FAR
PUSHF
PUSH AX
MOV AH,AL
SHR AL,4
ADD AL,'0'
CMP AL,'9'
JBE @@Hohes_Ok
ADD AL,'A'-('0'+10)
@@Hohes_Ok: CALL PUTCHAR
MOV AL,AH
AND AL,00FH
ADD AL,'0'
CMP AL,'9'
JBE @@Niedriges_Ok
ADD AL,'A'-('0'+10)
@@Niedriges_Ok: CALL PUTCHAR
POP AX
POPF
RET
PUTBYTE ENDP
; Hier beginnt der Programmteil zur Berechnung der Fakult?t.
; Die Prozeduren davor sind nur zur Ausgabe des Ergebnisses vorhanden.
start:
mov ax,1 ; Lade 1 in den Akku
mov cx,N ; Lade N in CX (Z?hlerregister)
looping: ; Sprungmarke f?r loop
mul cx ; Multipliziere AL mit CL
loop looping ; Solange CX gr?sser Null, springe zu Marke looping
; ab hier ist das Ergenis berechnet, jetzt folgt nur noch die Ausgabe und das Programmende
mov bl,al ; speichere den niederwertigen Teil des Ergebnisses in BL zwischen
mov al,ah ; AH f?r die Ausgabe nach AL verschieben
call PUTBYTE ; Rufe die Prozedur PUTBYTE auf, um den Wert in AL als Hexzahl auszugeben(h?herwertiger Teil des Ergebnisses)
mov al,bl ; in BL zwischengespeichertes AL zur?ckschieben
call PUTBYTE ; Ausgabe des niederwertigen Teils des Ergebnisses
ende:
mov AX,4C00h ; ordentliches Ende (Dos)
int 21h
end start
edit:
Oh Mann, die Formatierung ist im Forum ja nicht wirklich toll. Wei? jemand rat? :) -
Oh Mann, die Formatierung ist im Forum ja nicht wirklich toll. Wei? jemand rat? :)
Im "Beitrags-Schreib-Fenster" ist die Formatierung ganz ordentlich. Wir warten nur noch, bis der gro?e Chef die [соdе][/соdе]-Tags wieder in Ordnung bringt. Dort findet zwar eine Formatierung statt, aber es werden Zeilenumbr?che verdoppelt und "<" und ">" werden zu HTML-Character-Coded-Entities (< und so weiter). Notfalls kannst du deine Quelltexte ja hier
http://alopex.pyrokar.lima-city.de/srccodelist/index.php
hochladen und dann darauf verweisen. Allerdings ist dieser "Service" urspr?nglich f?r PHP-Quelltexte gedacht gewesen.
MfG
alopex
-
also.
der einfachste asm code f?r eine fakult?t:
[eax enth?lt den wert f?r den die fak. errechnet werden soll.]
mov ecx,eax
xor eax,eax
_l1:
add eax,ecx
addc ebx,0x00 ;evtl carry bit von eax wg. overflow
loop _l1
ret
so.
eax:ebx enth?lt jetzt den wert!
(das addc ebx,0x00 kann weggelassenwerden,wenn die fakult?t nie gr??er als 4,2 milliarden wird.)
wie das ganze auf den bildschirm kommt is 'ne andere sache.
mfg Dennis -
das thema kan geschlossen werden
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage