PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Viele Frage rund um ASM


Mike
25.04.2002, 22:01
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.

Mike
25.04.2002, 22:16
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...

Mike
25.04.2002, 22:21
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.

Mike
25.04.2002, 22:30
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?

Mike
25.04.2002, 22:36
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.

Mike
25.04.2002, 22:40
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).

Mike
25.04.2002, 22:45
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).

Mike
26.04.2002, 17:18
DANKE !