PlanetSwitch Planet3DS PlanetVita PSP.de PlanetiPhone Classics Forum Handheld-Wiki

PGN-ID:[?] (Nicht eingeloggt)
Login
Registrieren
PlanetDS PlanetGameboy N-Page.de
portablegaming.de  

Zurück   portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung


Development Abteilung Ihr wollt für euren Lieblingshandheld Spiele oder Tools entwickeln?
Bitte die Präfixe benutzen!

Umfrageergebnis anzeigen: Wer will Assembler auf dem PM lernen?
Ich will 13 61,90%
Ich nicht 7 33,33%
Ich kann schon PM-Assembler 1 4,76%
Multiple-Choice-Umfrage. Teilnehmer: 21. Du darfst bei dieser Umfrage nicht abstimmen

Antwort
 
LinkBack Themen-Optionen Thema durchsuchen
Alt 11.09.2004, 13:46   #1
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard PM Assembler Tutorial

So Leute, jetzt geht’s los. Ich fange hier einfach mal mit einen Tutorial zur Pokemon Mini Programmierung an. Ich werde versuchen alles so praxisorientiert wie möglich zu halten. Für viele wird es nicht einfach sein, aber ihr könnt jederzeit Fragen stellen (es gibt keine blöden Fragen).

Kommen wir zu den technischen Daten, das Pomi hat einen Bildschirm mit 96x64 Pixel. Darstellbar pro Pixel ist entweder Schwarz oder Weiß (bzw. Durchsichtig). An RAM stehen 4 KByte zur Verfügung, wovon bis zu ca. 1 KByte für die Grafik verwendet wird. Das klingt nicht nach viel, ist aber bei der Auflösung mehr als ausreichend. Der ROM ist bis zu 4 MByte groß und kann Code/Daten/Grafiken/... enthalten. 7 Knöpfe, ein Schüttelsensor bzw. Motor sind auch enthalten über den Sound ist nicht viel bekannt.

Das für uns wichtigste ist die CPU, sie ist von unbekanntem Typ, scheinbar eine Eigenentwicklung von Nintendo? Arbeitet im Normalfall mit 8 Bit Datentypen, also ist sie für mich ein 8 Bit-Prozessor (normalerweise ist die Datenbusbreite ausschlaggebend für die Bit-Benennung). Mit einer Taktfrequenz von 4 MHz, ist diese CPU relativ schnell (für so ein kleines Teil). Für etwas fortgeschrittene Benutzer ist noch anzumerken, dass es keine RISC-CPU ist und auch keinen Load/Store Architektur, deshalb ist sie für einen 8-Bitter sehr angenehm zu Programmieren.

--Stack

Bevor wir richtig loslegen, noch etwas zum Stack bzw. Stapelspeicher. Für alle die wissen wie ein Stack funktioniert, können sich die nächsten Zeilen sparen. Wer die ganze Sache nicht versteht, muss sich keine Sorgen machen, denn es ist im Moment nicht so wichtig.
Der Stack ist eigentlich nur ein Stück Speicher, der nach der LIFO (Last in, First out) Methode benutzt wird. Praktisch gesehen heißt das:
Ich habe drei Bücher A, B und C, lege nun Buch A auf den Stack dann Buch B und Buch C.
Will ich nun Buch A haben, muss ich Buch C und Buch B wieder vom Stapel nehmen. Natürlich kann man dies nicht einfach so im Computer ausdrücken,
hierfür nimmt man einen StackPointer (sp) oder auch Stapelzeiger genannt, zu Hilfe. Wichtig ist auch, dass der Stack im Speicher „rückwärts“ gesehen wird, d.h. das 1. Element steht ganz unten in diesem Speicherbereich. Wie lege ich nun etwas auf den Stack.Am Anfang muss natürlich der SP auf das oberste Element im Stack zeigen.
Also so:

[ ]
[ ]
[ ]
[ ] <- SP

Nun legen wir unser Buch A in den Stack mit der Regel
1.erniedrige Stack
2.kopiere Element in Stack (auf den der Stackpointer zeigt)
Somit ergibt sich

[ ]
[ ]
[ A ] <- SP
[ ]

jetzt noch Buch B

[ ]
[ B ] <- SP
[ A ]
[ ]

und Buch C

[ C ] <- SP
[ B ]
[ A ]
[ ]

Jetzt haben wir unsere Bücher auf dem Stack, jetzt wollen wir sie wieder zurück. Die Regel lautet:
1. hole (kopiere) Daten vom Stack (auf den der Stackpointer zeigt)
2. erhöhe Stackpointer

Also los geht's:
Buch C holen.

[ C ]
[ B ] <- SP
[ A ]
[ ]

usw.

Es ist noch zu bemerken, dass Daten die vom Stack geholt werden, nicht automatisch gelöscht werden, sondern sie werden nur kopiert.

--Datentypen

Assemblerprogrammierer habe es leicht, sie kennen nicht soviel Datentypen wie Hochsprachenprogrammierer.Wir brauchen im Allgemeinen nur diese vier:

Name Maximalgröße
Bit 1
Byte 255
Wort 65535
Langwort 4294967299

Beim Pomi sehen wir diese Bezeichnung etwas anders:

Name Maximalgröße Bitbreite
Byte 255 8
Wort 65535 16

--Was brauch ich

Zum Programmieren benötigt ihr einige Tools, die bekommt ihr alle unter http.//pokeme.shizzle.it.

Als Dos-Ersatz rate ich dringend zu Cygwin (www.cygwin.com)! Ladet euch das Cygwin-Setup herunter und installiert es.

Als nächstes macht ihr euch ein Verzeichnis für die Programme (egal wo und auf welcher Partition).
In dieses Verzeichnis entpackt ihr pmas (Assembler) und/oder mindx (Assembler) und PokeKaMini (Debugger). Ladet am besten das angefügte Testprogramm mit runter, und entpackt die Daten in euer Verzeichnis.

Als nächstes, Cygwin starten, dann wenn notwendig auf die Partition wechseln, in welcher euer Verzeichnis ist. Dann dort in das Verzeichnis wechseln (mit cd):

Z.B. so:

cd d:
cd Pokemon_Mini

Mit dm Befehl ls (oder dir), könnt ihr euch den Inhalt des Verzeichnisses ansehen.

Als ersten Test assemblieren wir das Testprogramm mit pmas. Dazu gebt ihr folgendes ein:

./pmas.exe tile_test.s tile_test.min

Wenn der Assembler keine Fehler meldet, habt ihr gerade aus der tile_test.s Quelldatei eine ROM-Datei erzeugt (tile_test.min).

Jetzt geht’s ans Testen, dazu öffnet ihr PokeKaMini (am besten aus dem Explorer). Bei PokeKaMini im Menü den ROM öffnen (File->Open .min). Als nächstes startet ihr den ROM mit Options->Full Speed Run (oder F5 drücken). Wenn ihr jetzt einen Text in einem neu geöffneten Fenster lesen könnt, hat alles geklappt.

---

Das reicht erstmal für den Anfang, ihr könnt euch die Datei tile_test.s ansehen. Über deren Inhalt reden wir beim nächsten mal. Etwas Feedback ist wichtig, bzw. sollten schon 1-2 Leute hier mitmachen und Versuchen Assembler auf dem Pomi zu lernen. Natürlich wird das kein Zuckerschlecken, deshalb sollten die Leute etwas Ausdauer besitzen und nicht nach einer Woche wieder aufgeben. Wer also Lust zum Lernen und Programmieren hat soll sich hier melden, denn für mich allein mach ich kein Tutorial mehr
Angehängte Dateien
Dateityp: zip Textausgabe.zip (5,0 KB, 83x aufgerufen)
goldmomo ist offline   Mit Zitat antworten
Sponsored Links
Alt 12.09.2004, 14:26   #2
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard RE: PM Assembler Tutorial

Bei dem riesigen Interesse :P, macht es keinen Sinn ein Tutorial zu schreiben. Für alle die etwas 8-Bit Assembler lernen wollen, können genug Z80 Tutorials im Internet finden (die PM-CPU ist dieser CPU relativ ähnlich).
goldmomo ist offline   Mit Zitat antworten
Alt 12.09.2004, 18:20   #3
ehem. Teammitglied
 
Benutzerbild von Vulnus
 
Registriert seit: 04.08.2002

Vulnus hat eine strahlende Zukunft
Vulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende Zukunft

Standard

Mal ne frage zu dem Stack Pointer.

Angenommen ich will Buch A haben , müsste das dann so sein :


[ C ]
[ B ]
[ A ]
[ ] <- SP

????

Hab jetzt so gedacht , dass der StackPointer immer einen unter dem Buch ist , dass ich haben will ( bzw einen drüber , da das ja alles rückwärts funzt )

oder muss ich dazu erst die Bücher C und B wegnehmen um mir dann A zu schnappen !?

Ansonsten danke fürs tutorial , war ja schonmal ein anfang für nen n00b wie mich

Und ich erwarte den nächsten schritt des Tutorials , schließlich hast dus mir versprochen :P
__________________
Nach müde kommt doof!
Vulnus ist offline   Mit Zitat antworten
Alt 12.09.2004, 18:29   #4
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Du kommst eigentlich nichtmehr zu Buch A, weil du schon darüber bist.
Müsstest jetzt da unbekannte Ding wegnehmen.

Siehs dir nochmal an, ist im Moment auch nicht so wichtig. Den Rest schreib ich bei Gelegenheit. Wichtig ist, dass du dir schonmal alles einrichtest und mal das Testprogamm Assemblierst. Darauf will ich dann aufbauen.
goldmomo ist offline   Mit Zitat antworten
Alt 14.09.2004, 15:39   #5
ehem. Teammitglied
 
Benutzerbild von Vulnus
 
Registriert seit: 04.08.2002

Vulnus hat eine strahlende Zukunft
Vulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende Zukunft

Standard

Neue frage

Code:
;**** header
		
.orgfill 0x21A4 

	.db "NINTENDO"			
	.db "TEST"
	.db "TESTTEST"			
	.orgfill 0x21Bc
	.db "TS"
Wofür ist der Header gut ??
Für dasselbe wie bei ner website , also praktisch nur zur Zierde !?
__________________
Nach müde kommt doof!
Vulnus ist offline   Mit Zitat antworten
Alt 14.09.2004, 15:48   #6
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

alles hinter ; oder # ist Kommentar
goldmomo ist offline   Mit Zitat antworten
Alt 14.09.2004, 16:40   #7
ehem. Teammitglied
 
Benutzerbild von Tharo
 
Registriert seit: 02.09.2002
Ort: フランクフルト
Spielt gerade: FF7 Remake

Tharo wird schon bald berühmt werdenTharo wird schon bald berühmt werden

Standard

Die Hardware erwartet den Header. Lässt du ihn aus, fängt dein Programm schlimmsten Falls an der falschen Stelle an. Bin nicht sicher ob der PM auch ohne gültigen Header startet, bei anderen Nintendo Produkten verweigert die Hardware dann den start aber der PM hat glaube ich nichtmal einen Ländercode .. könnte also auch ohne gehen.
__________________
Ney ney ney. So viel Sand und keine Förmchen

Code:
Hey DU! Join uns im PG Discord! https://discord.gg/SVqutfFpTc
Tharo ist offline   Mit Zitat antworten
Alt 14.09.2004, 17:01   #8
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Das BIOS ueberpreuft die "NINTENDO" String, sonst geht der ROM nicht, aber ohne eingebundenen BIOS (.incbin bios.raw), ist der Header unnoetig, schadet aber auch nicht.
goldmomo ist offline   Mit Zitat antworten
Alt 15.09.2004, 16:58   #9
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Weiter gehts,...

Register und Befehle:

Register sind Speicherzellen in der CPU, ein Grossteil der CPU-Funktionen
(Befehle) benutzen diese Register. Alle Register haben einen Namen, damit einfacher
auf sie zugegriffen werden kann. Durch ihre Integration in der CPU, ist eine
schnellere Bearbeitung möglich, als von normalem Speicher. Deshalb sollten
so viele Operationen wie möglich in Registern ausgeführt werden.

Die PM-CPU stellt folgende Register zur Verfügung:

(8 bits) : A, B, H, L, FLAGS, N
(16bits) : BA
(24bits) : HL, X1, X2, NN, SP

Sehr viele arithmetische (+,-,...) und logische (und,oder,...) Operationen, sind nur mit den
Registern a und b möglich. HL, X1, X2 sollten als Adressregister verwendet
werden.

Sehr wichtig ist die Breite eines Registers, im Normalfall sind sie 8 Bit breit,
dadurch passen auch nur Werte im Bereich 0 bis $ff hinein (0 bis 255). (Das
$-Zeichen kennzeichnet eine Hexadezimalzahl).

Weiterhin können 8 Bit Register zu einem 16 Bit Register kombiniert werden.
Dieser Fall tritt bei a und b , l und h auf. Wobei bei BA und HL, jeweils der
obere Name auch die oberen 8Bit angibt.

Z.B.: ist bei a=$12 und b=$ef -> ba = $ef12

Eine Besonderheit stellt der N register dar, bei der Verwendung von NN werden
die unteren 8Bit geloescht.

Z.B.: ist bei N=$af -> NN->$af00

SP ist der Stackpointer, FLAGS beinhaltet die Condition-Codes (später mehr
dazu) und einige Interrupt-Flags.

Wie gesagt können Befehle auf diese Register ausgeführt werden, alle
CPU-Befehle stehen in mindx.txt (aus dem mindx assembler).

z.B.:

Rechnen wir 1 + 2, wobei wir 1 und 2 in Registern halten möchten:

Code:
	
	mov	a,1
	mov	b,2
	add	a,b
Der Befehl mov kopiert einen Wert, in diesem Fall den Wert 1 in das Register A,
bzw. 2 in B. Zu beachten ist, dass das Ziel links steht und die Quelle rechts.
Der Befehl add, addiert die Quelle auf das Ziel (a=a+b), also geht der alte Wert in A verloren. Soetwas ist typisch bei 8 Bit CPUs, da sie fast immer nur mit 2 Operanten arbeiten.

Die CPU-Befehle sind sehr eingeschränkt, hier braucht niemand komplexe Funktionen zu erwarten, dazu aber später mehr.

Wie schon gesagt können viele Befehle auf die Register h,l,.. nicht zureifen, in diesem Fall muss auf a und b ausgelagert werden.

Z.b.:
Rechnen wir 4 + 5 in das Register h und l, dass Ergebnis soll in N stehen
Code:
		
	mov	h,4
	mov	l,5
	mov	a,h
	mov	b,l
	add	a,b
	mov	n,a
Zu sehen ist, dass h in a kopiert wird l in b und a=a+b gerechnet wird, dann a in n kopiert
wird. Das ist etwas umständlich, aber auch typisch für 8 Bitter.

Ich werde bei Gelegenheit ein Programm schreiben, dass errechnete Werte auf dem PM-Screen ausgibt, dann können wir einige Übungen starten und mit richtigen Variablen fortsetzen.

P.s.:

Es gibt noch zwei neue Register (gerade erst festgestellt). Beide 8 Bit,
Namen U und V. Sobald ein Sprung ausgeführt wird, ist V=U.
goldmomo ist offline   Mit Zitat antworten
Alt 15.09.2004, 19:12   #10
ehem. Teammitglied
 
Benutzerbild von Vulnus
 
Registriert seit: 04.08.2002

Vulnus hat eine strahlende Zukunft
Vulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende Zukunft

Standard

Code:
mov h,4
mov l,5
mov a,h
mov b,l
add a,b
mov n,a
könnte man das nicht einfach auf

Code:
mov h,4
mov l,5
add h,l
mov h
verkürzen ??
wofür muss ich die unbedingt in a und b wandeln !?

Ansonsten hab ich bis hierhin das meiste verstanden.
Danke dafür
__________________
Nach müde kommt doof!
Vulnus ist offline   Mit Zitat antworten
Alt 15.09.2004, 19:21   #11
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Nein eben nicht, weil es kein add h,l oder add l,h gibt. Das ist bei vielen Befehlen so.
Möglichkeiten für ein h+l gibts genug, z.B. das hier sichert b und a.

Code:
mov   h,4
mov   l,5
xchg  ba,hl
add   a,b
xchg  ba,hl
(xchg ba,hl bedeutet, dass der Inhalt von ba und hl getauscht werden.)
goldmomo ist offline   Mit Zitat antworten
Alt 15.09.2004, 19:30   #12
ehem. Teammitglied
 
Benutzerbild von Vulnus
 
Registriert seit: 04.08.2002

Vulnus hat eine strahlende Zukunft
Vulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende Zukunft

Standard

Somit ersetzt
Code:
xchg ba,hl
einfach das
Code:
mov a,h
mov b,l
???

Das wäre immerhin eine ganze Zeile code , die da gespart würde

Sry , wenn ich dumme fragen stelle , aber ich bin halt noch ein n00b und das ASM buch ist auch noch nicht da
__________________
Nach müde kommt doof!
Vulnus ist offline   Mit Zitat antworten
Alt 15.09.2004, 19:53   #13
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Ne, xchg tauscht. Wäre also mit einen virtuell gedachten Register t so:
t=a, a=l, l=t, t=b, b=h, h=t (also 6 Befehle) (mit einer XOR Methode würde es ohne temp gehen).

----

zum Testen habe ich mal was gemacht, der ROM gibt die Register AB,HL,X1,X2 auf den Bildschirm in Hexcode aus (Dezimal mache ich später). Wer nicht mit dem Hexcode zurecht kommt, kann den Windows-Taschenrechner zum umrechnen nehmen.

Einfach in der Datei tile_test_dez_hex.s zwischen den zwei unübersehbaren Kommentaren den Test-Code einfügen. Das mov ... Zeug könnt ihr entfernen, ist nur zum Test.

Code:
;**************************************************************************************
;**************************** HIER KOMMT DER TESTCODE HIN *****************************
;**************************************************************************************
	
	mov	ba,$0123
	mov	hl,$4567
	mov	x1,$89ab
	mov	x2,$cdef
	
;**************************************************************************************
;*********************************** TEST CODE ENDE ***********************************
;**************************************************************************************

Achso, nicht vergessen zu Assemblieren (am besten den neusten pmas runterladen URL: http://darkfader.net/pm/ ).
Angehängte Dateien
Dateityp: zip Pokemon_Mini_tut2.zip (2,5 KB, 57x aufgerufen)
goldmomo ist offline   Mit Zitat antworten
Alt 15.09.2004, 22:02   #14
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

So nochmal ne gute Nachricht es gibt 24 (vierundzwanzig) Hardware-Sprites die je 16x16 Pixel groß sein können. Die pmdev Leute suchen noch weiter, aber es scheint immer besser zu werden. Damit kann man schon richtig komplexe Spiele machen, ein Mario/Zelda-Clone ist schon kein Problem mehr. Also machts Sinn hier weiter zu lernen
goldmomo ist offline   Mit Zitat antworten
Alt 16.09.2004, 11:47   #15
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Weiter zu den Befehle:

Wie schon gesagt gibt es arithmetische und logische Befehle.
Arithmetische Befehle sind add,sub,mul,div,... also normalen Grundrechenarten.
Logische Befehle sind z.b and,or,xor,shl,shr,... also Befehle die logisch Bits
verarbeiten.

Zu den arithmetischen Funktionen gibt es nicht viel zu sagen, einfach in mindx.txt
nachsehen. Aus bestimmten Gründen gibt es für eine Addition mit 1 bzw. eine
Subtraktion mit 1 eigene Befehle. Die Namen sind inc (increment (+1)) und dec
(decrement (-1)).

Z.B.: ;l=5 dann um 1 addieren und mit 99 multiplizieren
Code:
		mov	l,5		;l=5
		inc	l		;l=l+1
		mov	a,99		;a=99
		mul	l,a		;hl=l*a
Zu beachten ist, dass es nur mul l,a gibt, andere Register sind
nicht zulässig. Das Ergebnis steht in hl, der Grund für die
Verwendung von 2 Register ist klar, denn zwei 8 Bit Werte die
multipliziert werden können einen 16 Bit Wert erzeugen.

Am besten in dem 2. Tutfile, etwas rumprobieren.

Logische Funktionen sind and,or,xor,shl,...
And und Or sind logische bitweise arbeitende unds und oders

Die Logiktabellen fuer and,or,xor sind wie folgt.
Code:
(A = Quelle 1, B = Quelle 2, E = Ergebnis)

AB | E

and

00 | 0
01 | 0
10 | 0 
11 | 1

or

00 | 0
01 | 1
10 | 1 
11 | 1

xor

00 | 0
01 | 1
10 | 1 
11 | 0
Die Beispiele waren jetzt für je ein Bit der Quellen, da die Register aber im
Normalfall 8Bit groß sind, wird über alle Bits gearbeitet.

z.B. ;a=$af ;b=$12
Code:
		mov	a,$af	; 10101111
		mov	b,$12	; 00010010
		and	a,b	; 00000010 (Ergebnis)
		
		mov	a,$af	; 10101111
		mov	b,$12	; 00010010
		or	a,b	; 10111111 (Ergebnis)
		
		ov	a,$af	; 10101111
		mov	b,$12	; 00010010
		xor	a,b	; 10111101 (Ergebnis)
In den Kommentaren, sind die Hexzahlen binär dargestellt, dadurch sind die
Funktionen besser zu verstehen.
Praktisch gesehen fallen bei And nur Bits durch die in den Quellen gleich sind,
bei Or wird sobald ein Bit 1 ist das Ziel gesetzt. Bei Xor nur wenn die Quellen
unterschiedliche Bits haben.

Hier sollte unbedingt geübt werden, die logischen Funktionen sind sehr wichtig.

Schieben:

Eine weitere wichtige Sache ist das Bit-Schieben (Shift).

ich gehe jetzt nur Grundlegend auf die simpelsten Shifts ein, den Rest erkläre
ich später.
Mit den Befehl shl werden alle Bits um eine Stelle nach Links verschoben (der
Übertrag fällt raus, nachgeschoben wird 0). Bei shr wird nach rechts
geschoben.

z.B.: ;a = $0a soll 3 Bit nach links verschoben werden
Code:
		mov	a,$0a	;00001010 ($0a)
		shl	a	;00010100 ($14)
		shl	a	;00101000 ($28)
		shl	a	;01010000 ($50)
;a = $c0 soll 2 bits nach rechts verschoben
Code:
		
		mov	a,$c0	;11000000 ($c0)
		shr	a	;01100000 ($06)
		shr	a	;00110000 ($03)
Das Rollen und arithmetische shifts mache ich später. Hier sollte erst mal etwas
geübt werden. Anzumerken ist, dass ein shl immer eine Multiplikation mit 2
darstellt und eine shr eine Division durch 2.

;a = 12 soll durch 4 geteilt werden
Code:
		
		mov	a,12
		shr	a		;a=a/2 (=6)
		shr	a		;a=a/2 (=3)
;b = 9 soll mit 2 multipliziert werden
Code:
		
		mov	b,9
		shl	b		;b=b*2 (18)
Wenn ihr euch fragt warum hier nicht mul/div genommen wird, gibts nur zu
sagen, dass ein Shift technisch sehr einfach möglich ist ein mul/div benötigt
aber sehr viel Logik. Deshalb ist shl/shr um Welten schneller (beim PM schätze
ich ca. Faktor 40).

Aber jetzt solltet ihr vielleicht etwas selber machen, damit ich sehe das mein
geschriebenes Sinn macht, gibt einige Aufgaben. Ihr könnt wie gesagt euren Code
mit dem letzten Tut Programm testen.

Aufgabe 1:

gegeben: a=5 gesucht: b=((a+1)*2)-1

Aufgabe 2:

gegeben: l=8 gesucht: l=(l-1)*45 (Achtung es gibt nur mul l,a)

Aufgabe 3 (etwas schwieriger):

gegeben: a=7 gesucht: a=a*7 (ohne mul Befehl zu verwenden)

Sobald hier jemand eine Aufgabe geloesst haben, mach ich weiter :P
goldmomo ist offline   Mit Zitat antworten
Alt 16.09.2004, 17:13   #16
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

So hier eine Version, welche die Register dezimal ausgibt. Der Testcode kommt wieder zwischen die großen Kommentare.
Angehängte Dateien
Dateityp: zip Pokemon_Mini_tut3.zip (2,8 KB, 56x aufgerufen)
goldmomo ist offline   Mit Zitat antworten
Alt 16.09.2004, 21:31   #17
ehem. Teammitglied
 
Registriert seit: 06.08.2002
Alter: 32

Oposum wird schon bald berühmt werden

Oposum eine Nachricht über ICQ schicken
Standard

so.. ich hab mich auchmal aufgemacht..
meine Lösung für aufgabe 1 ist:
Code:
	;**************************************************************************************
	;**************************** HIER KOMMT DER TESTCODE HIN *****************************
	;**************************************************************************************
	
	mov a,5
	mov b,1
	add a,b
	mov a,L
	mov a,2
	mul L,a
	mov L,a
	mov b,1
	dec b
	
	;**************************************************************************************
	;*********************************** TEST CODE ENDE ***********************************
	;**************************************************************************************
Oposum ist offline   Mit Zitat antworten
Alt 16.09.2004, 21:54   #18
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Fast richtig

in Zeile 8: sollte mov L,a stehen und Zeile 11 kann weg

Wie gesagt es gibt unmengen an Lösungsmöglichkeiten in Assembler, man kann es fast immer irgendwie anders machen.

Hier eine andere Lösung für Aufgabe 1.

Code:
	mov	a,5
	
	inc	a		;a+1
	shl	a		;*2
	dec	a		;-1
	mov	b,a		;in b
Am Anfang schreibt natürlich niemand optimalen Code, deshalb weiter üben.

Nochmal zum tTsten, das Programm (dieser Code) sollte in PM_tut2 eingefügt, als Ausgabe BA=0B0B ausgeben.

Das Ergebnis ist also Richtig da B=$0B (oberen zwei Ziffern) und $0B ist Hexadezimal, dezimal ist es 11. A ist natürlich auch $0B weil wir alles mit A gerechnet haben und am Ende nur in B kopiert haben.

Nochmal für alle die Hex Codes

$00=0
$01=1
$02=2
$03=3
$04=4
$05=5
$06=6
$07=7
$08=8
$09=9
$0A=10
$0B=11
$0C=12
$0D=13
$0E=14
$0F=15
$10=16
$11=17
$12=18
......

p.s. die *.s Datein mit einen beliebigen Editor öffnen (z.B. Notepad). Dann auch mit pmas assemblieren.

Z.B.:

pmas.exe tile_test_dez_hex.s tile_test_dez_hex.min

Hier nochmal das Bild was angezeigt werden müsste.
Miniaturansicht angehängter Grafiken
PM Assembler Tutorial-0b0b.png  
goldmomo ist offline   Mit Zitat antworten
Alt 17.09.2004, 08:56   #19
ehem. Teammitglied
 
Benutzerbild von Vulnus
 
Registriert seit: 04.08.2002

Vulnus hat eine strahlende Zukunft
Vulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende ZukunftVulnus hat eine strahlende Zukunft

Standard

So hab ich aufgabe 2 gelöst ::

Code:
mov L,8
dec L
mov a,45
mul L,a
Ist es schlimm , wenn ich im Notepade nicht die abstände einhalte ??
Dein code ist irgendwie immer so mittig oder so
__________________
Nach müde kommt doof!
Vulnus ist offline   Mit Zitat antworten
Alt 17.09.2004, 09:21   #20
Moderator
 
Benutzerbild von goldmomo
 
Registriert seit: 03.02.2003

goldmomo hat die Renommee-Anzeige deaktiviert

Standard

Ist richtig

Noch eine Hilfe fuer Aufgabe 3, a*7 ist das gleiche wie a*8-a. Und fuer a*8 braucht man keinen mul Befehl.

Als Editor wuerde ich Ultraedit oder einen anderen gescheiten Editor empfehlen, mit Notepad/Wordpad hat man nicht viel Freude. Im pmas.zip liegt auch ein Wordfile fuer Ultraedit bei, dann hat man Syntaxhighlighting (ist bei Assembler aber eigentlich unnoetig).
goldmomo ist offline   Mit Zitat antworten
Antwort

  portablegaming.de > Allgemeines Spielehandheldforum, GBA, N-Gage und Development > Development Abteilung

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Suche besseren Assembler Vertex Development Abteilung 6 16.12.2005 08:11
grafik-modus in assembler coolyo Development Abteilung 0 04.10.2003 19:17
Tutorial 3 hurik Development Abteilung 2 27.07.2002 19:34
Tutorial 1 Darkside Development Abteilung 4 09.06.2002 17:44
Tutorial 2 Darkside Development Abteilung 4 28.04.2002 22:03


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:43 Uhr.


Powered by vBulletin® Version 3.8.9 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0
Template-Modifikationen durch TMS
PortableGaming.de © bk 2000 - 2010

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231