Archiv verlassen und diese Seite im Standarddesign anzeigen : Viele Frage rund um ASM
Hi,
also ich bin ein mega Anfänger in Sachen ASM aber ich habe it Hilfe von vielen Tutorials und SourceCodes ein kleines eigenes OS gebastelt...naja, wie mans nimt, es bootet und sagt "HALLO"...
also habe ich ein paar Fragen:
1. Wie kann ich mehrere Zeilen Text untereinander schreiben ???
2. Kann man aus Assembler heraus auch externe EXE Dateien (in C/C++ geschrieben) aufrufen...
Naja, das dürfte doch für den Anfang erstal reichen...
Vielen Dank schonmal im Vorraus
Mike
Felix Kaiser
25.04.2002, 22:08
Ausführen: Erfordert MS DOS Services auf Interrupt 0x21, schau dir mal die Funktion AH=4Bh an. Damit kannst du Programme ausführen und Overlays laden.
Mehrere Zeilen: Einfach nach dem du eine Zeile fertig hast, einen CRLF (Carriage Return & Line Feed) einfügen und nächste Zeile, z.B.
Message1 db ´Zeile 1´,0Dh,0Ah,´Zeile 2´,0Dh,0Ah,´Zeile 3´,0
Wäre ein ASCIIZ (nullterminierender String), der sich über 3 Bildschirmzeilen erstreckt.
Hey,
danke, das zweite hab ich kapiert mit de CRLF,
aber das mit dem Interrupt 0x21 und Funktion
AH=4Bh...naja, wie gesagt, ich bin mega Anfänger und
ich weiß überhaupt nicht, was das bedeuten soll *schäm*
Könntest du mir vielleicht ein bsp Code zeigen wie ich eine exe aufrufe ?
Wäre nett...
Mike
Felix Kaiser
25.04.2002, 22:19
Hab ich nicht im Kopf, steht aber in jeder DOS Interrupt Doku drin. Kanns dir morgen ja mal raussuchen...
sorry,
#
was ist eine dos interrupt doku ??? ;(
Mike
Felix Kaiser
25.04.2002, 22:27
Eine Dokumentation die die Funktionen die der Interrupt 0x21, welcher von DOS zur Verfügung gestellt wird, beschreibt mit Parametern und möglichen Ergebniswerten. Da steht halt einfach drin was man mit dem Teil machen kann und wie mans tut :)
Hab da auch ne Astreine ... weiß nicht obs dazu ne URL gibt. Ist aber zu groß als um per Mail versandt zu werden.
servus,
also ich hab grad mein "os" getestet, und das funktioniert mit der multiline, ABER der macht zweimal mittem im text zwei so komische runde zeichen, wie krieg ich die wieder weg...?
also, wäre ganz cool, wenn du mir so ne url schicken könntest...
mike
Felix Kaiser
25.04.2002, 22:34
Komische runde Zeichen? Wie gibst du den Text denn an den Bildschirm aus?
jo,
welcome db "************************************************************",0Dh,0Ah, "**** Welcome to y OS 0,001 ****",0Dh,0Ah, "************************************************************",0 ;
...
mov si , OFFSET welcome
Felix Kaiser
25.04.2002, 22:37
Das meinte ich eigentlich nicht ;) Eher den Teil nach mov si,offset welcome. Welche Funktionen benutzt du dafür? Weil offenbar welche, die Probleme bei der Formatierung des CRLF haben.
so hier, der komplette Code, und ehrlich gesagt kann ich mit nix davon was anfangen *g*
_Text SEGMENT PUBLIC USE16
assume CS:_Text, DS:_Text
org 0
Entry:
db 0EAh
dw OFFSET AfterData, 7C0h
welcome db "************************************************************",0Dh,0Ah, "**** Welcome to my OS 0,001 ****",0Dh,0Ah, "************************************************************",0 ;
AfterData:
push CS
pop DS
mov si , OFFSET welcome
do:
mov AL, DS:[SI]
inc SI
or AL, AL
jz done;
mov BX, 0
mov AH, 0Eh
int 10h
jmp do;
done : ;
jmp $ ;
org 510
dw 0AA55h
_Text ENDS
END
Mike
Felix Kaiser
25.04.2002, 22:43
Ist zwar nicht sauber gelöst, aber MUSS funktionieren. TeleTYper Output macht das ja alles und darf eigentlich auch nix weiter als umbrechen und Cursor zurücksetzen. Weil so machts jeder und so funktionierts bei jedem. Kannst du die Blöcke näher beschreiben? Ich überleg dann mal was bis morgen (mal sehen).
ich kann dir nur noch die comments dazu schreiben die dabei waren...
_Text SEGMENT PUBLIC USE16
assume CS:_Text, DS:_Text
org 0
; This is the entry point for the program
Entry:
db 0EAh ; jmp far SEG:OFS ; Currently we are at 0:7C00
dw OFFSET AfterData, 7C0h ; This makes us be at 7C0:0
; Our Message to the world
; ========================
welcome db "************************************************************",0Dh,0Ah, "**** Welcome to my OS 0,001 ****",0Dh,0Ah, "************************************************************",0 ;
AfterData:
push CS
pop DS ; update DS to be 7C0 instead of 0
; Display Hello World
; ===================
mov si , OFFSET welcome
do:
mov AL, DS:[SI]
inc SI
or AL, AL
jz done;
mov BX, 0
mov AH, 0Eh
int 10h
jmp do;
done : ;
; OK We have displayed the message
; ================================
jmp $ ;
; Hang the system
; ===============
; Make the file 512 bytes long
; ============================
org 510
; Add the boot signature
; ======================
dw 0AA55h
_Text ENDS
END
Felix Kaiser
26.04.2002, 14:56
Ja nee ich weiß ja was die Befehle tun. Nach einigen Jahren assemblieren und debuggen braucht man keinen Debugger mehr so richtig %)
Der Code ist eigentlich schon in Ordnung ...
Hier der Code zum Ausführen von einem DOS Programm, astrein ohne Kommentare, so wie mein Code halt ist :D
.model tiny
.code
org 100h
entry: jmp short start
prog db ´modeup.exe´,0
cmd2 dw 0
dw offset cmd1
dw ?
dw -1
dw -1
dw -1
dw -1
cmd1 db 0
db 13
save_sp dw ?
save_ss dw ?
start: mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp,0FEh
mov ah,4Ah
mov bx,1000h
int 21h
push es
push ds
mov save_sp,sp
mov save_ss,ss
mov ax,4B00h
mov bx,offset cmd2
mov [bx+4],cs
mov dx,offset prog
int 21h
cli
mov sp,cs:[save_sp]
mov ss,cs:[save_ss]
sti
pop ds
pop es
mov ax,4C00h
int 21h
end entry
Ja halt Beispiel für TINY Modell...
Ist aber halt wichtig dass das Prog was ein andere aufruft nicht den ganzen DOS Speicher ausfüllt. Daher realloziere ich das Codesegment auf 4096 Paragraphen (64K).
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.