Assembler und C OS
-
hab ich eigentlich gemacht.
geht aber irgendwie nicht.
-
Poste mal etwas code...
-
lesen:
mov ah, 00h
int 016hcmp al, 27
jmp resetreset:
db 0Eah
dw 0000h
dw 0FFFFhwas funktioniert hier nicht?
-
servus schrieb:
...
cmp al, 27
jmp reset
...Das ist ein einfacher jump. Der wird immer ausgefuehrt - egal was in al steht.
Hier muesstest du einen bedingten Sprung-befehl einsetzen.
Anbieten wuerde sich "je" (jump if equal).
-
ich werde es probieren.
poste dann das ergebnis.
auf jeden fall danke!
-
es geht immer noch nicht.
poste jetzt ganzen code.Bootloader:
org 0x7C00
start:
cli
mov ax, 0x9000
mov ss, ax
mov sp, 0
stimov [bootdriv], dl
call load
mov ax, 0x1000
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retfbootdriv db 0
loadmsg db "Lade...",13,10,0putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retnload:
push ds
mov ax, 0
mov dl, [bootdriv]
int 13h
pop ds
jc loadload1:
mov ax,0x1000
mov es,ax
mov bx, 0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load1
mov si,loadmsg
call putstr
retntimes 512-($)-2 db 0
dw 0AA55hUnd der Kernel:
mov ax, 1000h
mov ds, ax
mov es, axstart:
mov si, nachricht
call schreibenmov si, nachricht2
call schreibenmov si, nachricht3
call schreibencall lesen
nachricht db "Willkommen...",13,10,0
nachricht2 db "Erstellt am 21.Oktober 2003",13,10,0
nachricht3 db "Druecken Sie Escape um den Computer neu zu starten!",13,10,0
schreiben:
lodsb
or al, al
jz short schreiben_d
mov ah, 0x0E
mov bx, 0x0007
int 0x10
jmp schreibenschreiben_d:
retnlesen:
mov ah, 00h
int 016hcmp al, 27
je resetreset:
db 0Eah
dw 0000h
dw 0FFFFhBin für die Hilfe sehr dankbar.
Es startet aber immern noch bei jeder Taste neu???!!!
-
Was sollte auch passieren, als dass neu gestartet wird?
Dein Code enthaelt ueberhaupt keine Alternative.
Wenn du mal genau hinsiehst, wird dir auffallen, dass der code unter dem label "reset:" auch jetzt noch IMMER ausgefuehrt wird, unabhaengig davon, welche Taste gedrueckt wird (bzw. welchen Wert al hat).
Wird ESC gedrueckt, wird der Jump zwar ausgefuehrt, das aendert aber nichts, da nur zur naechsten Instruction gesprungen wird.
-
bin noch ein großer anfänger.
was soll ich jetzt tun?
einfach eine alternative einfügen?
-
cmp al, 27 je reset ;hier waere einzufuegen, was geschehen soll, wenn NICHT ESC gedrueckt wurde... ;zB. koennte zurueckgesprungen werden, um noch einmal eine Taste Druecken zu lassen... jmp lesen reset: db 0Eah dw 0000h dw 0FFFFh
-
probier ich gleich mal aus.
Danke Dir!
-
Funktioniert!DANKE!!!!
Hab aber schon wieder ein Problem:wollte machen, dass bei der Enter-Taste ein Zeilenvorschub stattfindet, es funktioniert zwar, aber der Computer startet schon wieder bei jeder anderen Taste neu! Was soll ich tun?
lesen:
mov ah, 00h
int 016hcmp al, 27
je resetcmp al, 13
je NewLinejmp EchoChar
NewLine:
mov si, prompt
call schreiben
jmp lesenEchoChar:
mov ah, 0x0E
mov bx, 0x0007
int 10hreset:
db 0Eah
dw 0000h
dw 0FFFFhprompt db 13, 10, 'C:\>', 0
Danke für die Hilfe.
-
Eigentlich wieder das gleiche Problem:
EchoChar: mov ah, 0x0E mov bx, 0x0007 int 10h ;<==Hier >Markierung< reset: db 0Eah dw 0000h dw 0FFFFh
Wenn du nichts weiter (zB. eine jmp-Anweisung zu "lese", um den naechsten Char einzulesen) ans Ende der EchoChar-"Prozedur" (siehe Markierung) setzt, wird einfach stur der naechste OpCode, den die CPU findet, ausgefuehrt - egal ob im Quelltext ein Label dazwischensteht oder nicht.
In diesem Fall ist der naechste OpCode nach der Zeichenausgabe via int 10h nunmal "db 0Eah (usw...)", was den Neustart herbeifuehrt.
-
EchoChar:;
mov ah, 0x0E
mov bx, 0x0007
int 10h
jmp lesenreset:;
db 0Eah
dw 0000h
dw 0FFFFhsollte so gehen, oder?
der computer stürtzt aber jetzt immer abWas ist eigentlich der Zahlencode für die F1 Taste?
-
Zum Code: Jo, sollte so gehen.
Zum Absturz: Absturz ist nicht immer gleich Absturz.Eine etwas genauere Beschreibung der Vorgaenge waere hilfreich.
Zu F1: int 16h gibt ax=3B00h zurueck.
-
Hallo.
Hab noch ein bisschen rum probiert, passieren tut bei diesem Code folgendes:
lesen:
mov ah, 00h
int 016hcmp al, 27
je resetcmp al, 13
je NewLineNewLine:
mov si, prompt
call schreiben
je EchoCharEchoChar:
mov ah, 0x0E
mov bx, 0x0007
int 10h
je lesenreset:
db 0Eah
dw 0000h
dw 0FFFFhprompt db 13, 10, 'C:\>', 0
Computer startet bei Escape neu, bei Enter Zeilenvorschub. Dieser findet aber jetzt bei jeder anderen Taste auch statt. ich raffs nicht!
-
lesen: mov ah, 00h int 016h cmp al, 27 je reset ;Sprung, wenn al=27 cmp al, 13 je NewLine ;Sprung wenn al=13 ;<==hier kommts hin, wenn al weder 27 noch 13 ist. (ESC/Return) ;und was folgt da unten? richtig: das gleiche, wie wenn al=13 waere... NewLine: mov si, prompt call schreiben ;was soll das hier bewirken? ;das ZF ist beim Verlassen der Prozedur "schreiben" IMMER gesetzt. ;nun wird also nach echochar gesprungen, was aber sowieso die naechste Anweisung waere, die hier ausgefuehrt wuerde. ;=> Es ist 1. Sinnlos hier einen bedingten Sprung hinzusetzen und 2. ist das ZIEL dieses Sprungs unsinnig! je EchoChar EchoChar: mov ah, 0x0E mov bx, 0x0007 int 10h ;und was soll das hier bewirken? ;das ZF ist auch hier immer gesetzt => da wuerde es ein normaler jmp auch tun... je lesen reset: db 0Eah dw 0000h dw 0FFFFh
Sry, aber irgendwie habe ich den Eindruck, dass wir so auf keinen gruenen Zweig kommen.
Ich wuerde dir doch eher empfehlen, dass du dir erstmal ein ASM-Tutorial mit den Basics durchliest (Hallo Welt-Programme etc.) und hierbei aufpasst, dass du ausnahmslos alles richtig verstehst.
zB. Aus den Asm-FAQ => ASM TUTORIALS => unter Intel Syntax Assembler Tutorials => ab "Assembler - Einführung 1"
Die Codebeispiele nachher sind zwar fuer TASM, aber da die OpCodes die gleichen sind (die Assembler-Instruktionen sind andere!), denke ich, dass man das um die Basics zu lernen auf NASM uebertragen koennen sollte.Sollte dort etwas nicht klar sein, kannst du hier ja immernoch fragen.
(zB. falls du einen code absolut nicht uebertragen kannst)
-
TriPhoenix schrieb:
Nun, gedacht ists nur für mich bzw. es wird wohl kaum jemand nutzen sonst
Aber den Code kannste gerne angucken:
http://a.triphoenix.de/trios-pre-alpha-0.0.1.tar.bz2Hi die tar.bz2 kann mein WinZIP net entpacken, kannst du büdde eine ZIP machen? Würd mir sehr gerne deinen Memory Manager angucken
-
falsches Betriebssystem und mangelnde tools
-
lesen:
mov ah, 00h
int 016hcmp al, 27
je resetcmp al, 13
je NewLinejmp lesen
NewLine:
mov si, prompt
call schreibenEchoChar:
mov ah, 0x0E
mov bx, 0x0007
int 10h
jmp lesenreset:
db 0Eah
dw 0000h
dw 0FFFFhprompt db 13, 10, 'C:\>', 0
Sollte jetzt doch so funktionieren, oder?
Der Pc stürzt aber dann ab, sobald der Text (nachricht 1- 4)
angezeigt wird.
-
könntet ihr mir bitte helfen?
was ist hier noch falsch?