JOat
Hatt jemand irgendwo ne koplette überischt über die ganzen Assemblerbefehle (mov,add,subb,....usw)
und ausserdem such ich noch ne beschreibung wie schleifen in assembler aufgebaut sind (for while do.... usw.)
THX
ThiefMaster
Aus einem Assembler-Tutorial:
| Zitat: |
*-- 11. Loops (Schleifen)
Was sind Schleifen ? Wenn ihr schonmal in einer höheren Sprache programmiert habt,
kennt ihr sicherlich 'do while' oder 'loop until' schleifen. Wenn nicht, dann erklär
ich euch was eine Schleife macht: Eine Schleife führt einen bestimmten Codeabschnitt
solange aus, bis eine vorher festgelegte Bedingung erfüllt ist. Bei uns verwenden wir
den Register CX als Zähler für die Schleife. Wir setzen also in CX den Wert, der
die Anzahl der Durchläufe enthält. CX wird mit jedem Durchlauf automatisch um eins
vermindert.
------(LoopIT.asm)------
.model tiny
.code
org 100h
START:
mov cx, 3h ;wir setzen den Zähler auf 3
Schleife:
lea dx, MSG1 ;das gleiche wie mov dx, offset MSG1
mov ah, 9h
int 21h
loop schleife ;zurück zum Label Schleife
ENDE: ;schönes Label oder ?
mov ah,4ch ;4Ch zum Beenden
INT 21h ;Beende !
MSG1 db 'Schleife ..1,2,3.. ',10d,13d,'$' ;Ein String..
END START ;hier ist das ganze zuende..
----------ende-----------
Hiermit zeigen wir den Text 3 mal.. Man kann Schleifen auch ineinander
Verschachteln, man muss dann allerdings darauf achten, das man CX speichert (push/pop) |
Flamesword
Du hast die rep-Schleife vergessen :
| Zitat: |
-- 12. Repeat it...
Was aber, wenn man nur ein Commando wiederholen will ?
Lohnt sich der Aufwand mit loop ? Nein, dafür haben wir nämlich das REP-Kommando.
Auch hier setzen wir wieder die Anzahl in CX und schreiben dann hinter das REP
unseren Befehl, den wir mehrfach ausführen wollen...
--8<---(REP.asm)------
.model tiny
.code
org 100h
START:
mov cx, 3h ;wir setzen den Zähler auf 3
rep call write ;wiederhole den call zu write 3 mal..
ENDE: ;schönes Label oder ?
mov ah,4ch ;4Ch zum Beenden
INT 21h ;Beende !
Write:
lea dx, MSG1 ;das gleiche wie mov dx, offset MSG1
mov ah, 9h
int 21h
ret
MSG1 db 'Schleife ..1,2,3.. ',10d,13d,'$' ;Ein String..
END START ;hier ist das ganze zuende..
|
ciruZ
Ih, is ja wiederlich, ist ja MASM (Microsoft Assembler). Damit kann man doch noch nichtmal ne flat binary machen, oder? Naja, ich nehm NASM.
Ich poste mal ein einfaches Hallo Welt in ner Schleife für Linux (interupt 80h oder auch im GNU As 0x80)
In Intel Sytax (z.B. für NASM):
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
|
section text
msg db 'Hallo Welt',0Ah
msg equ $ - msg
global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 80h
jmp _start
|
|
AT&T Syntax (z.B. für GAS):
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
|
.data
msg:
.ascii "Hallo Welt\n"
len = . - msg
.text
.global _start
_start:
movl 4, %eax
movl 1, %ebx
movl $msg, %ecx
movl $len, %edx
int $0x80
jmp _start
|
|
Du siehst also, schleifen sind in beiden Syntaxen ziemlich gleich.
Wenn du vorher ein CMP verwendet hast kannst du jmp ersetzen durch:
- jz > Nur springen, wenn es zutrifft
- jne > Nur springen, wenn es nicht zutrifft
Wenn du sonst noch Infos brauchst melde dich, z.B. Infos wie du es machst wenn du unter keinem Betriebssystem bist, also z.B: dein eigenes OS codest, da ist es nicht viel anders.
// Edit:
Ach ja, über loop etc. schleifen machen find ich zum kotzen

...
Zumal das von der Speed glaub ich auch nicht grade das wahre ist
ciruZ
| Zitat: |
Original von ThiefMaster
Der Code ist für TASM
|
Dann ist der genau so schlimm wie MASM

...
NASM [KEIN Tippfehler] gefällt mir da gleich viel bessa

...
MASM = Microsoft Assembler
NASM = Netwide Assembler
Gibt beide und das is blöd wenn man sich vertippt
ciruZ
jap: Ich glaub die meisten hier reden vom Intel 80386 - 80686 Prozessoren
Klar, könnte auch Sparc oder PPC sein, aber die meisten haben ja leider Intel Prozessoren, von daher sagt man eigentlich nur noch Assembler an Stelle von ia32 Assembler.