ASM Problem

//Dieser Thread war Bestandteil eines anderen Threads (Datei unlöschbar) und wurde geteilt// **SUID:root**


Joa, danke. Mit der Konsole hat's geklappt. :)

Wo der Thread gerade offen ist: (Wird etwas off-topic...)
Hab das Programm jetzt mit dieser Batch-Datei kompiliert
@echo off
: -------------------------------
: if resources exist, build them
: -------------------------------

if exist %1.obj del ProjectX.obj
if exist %1.exe del ProjectX.exe

: -----------------------------------------
: assemble Project.asm into an OBJ file
: -----------------------------------------
\MASM32\BIN\Ml.exe test.asm
if errorlevel 1 goto errasm


: --------------------------------------------------
: link the main OBJ file with the resource OBJ file
: --------------------------------------------------
\MASM32\BIN\link16.exe test.obj
if errorlevel 1 goto errlink
dir ProjectX.*
goto TheEnd

:nores
: -----------------------
: link the main OBJ file
: -----------------------
\MASM32\BIN\link16.exe /SUBSYSTEM:WINDOWS test.obj
if errorlevel 1 goto errlink
dir ProjectX.*
goto TheEnd

:errlink
: ----------------------------------------------------
: display message if there is an error during linking
: ----------------------------------------------------
echo.
echo There has been an error while linking this project.
echo.
goto TheEnd

:errasm
: -----------------------------------------------------
: display message if there is an error during assembly
: -----------------------------------------------------
echo.
echo There has been an error while assembling this project.
echo.
goto TheEnd

:TheEnd

pause

Und die Ausgabe meines Programms lautet:
"


┤ ║♂☺═!┤L═!Hello World !!
"
(Hier HTML-konform dargestellt)
Es soll aber nur das "Hello World !!" in einer Zeile ausgegeben werden. O.o
Liegt das auch noch am Linker/Assembler oder am Code?

Code:
Code:
 .model tiny
.code
org 100h

START:

mov ah, 09h
mov dx,
INT 21h

ENDE:

mov ah,4ch
INT 21h

HelloWorld db 'Hello World !!',10d,13d,'$' 

END START
Sieht mir so aus, als würde der untere Registerbereich auch ausgegeben werden...

Edit:Hmm... spontane überlegung - Ist der Assembler vlt. 32 Bit und der Linker nur 16, so das bei dem Befehl nur in die Oberen 16 Bit des Speichers geschrieben werden?
&
Joa, das Programm werd ich mir mal ansehen. :)
 
Als Tipp: statt den eingebauten Taskmanager mal den ProcessExplorer von Sysinternals probieren - nicht nur detailiertere Anzeige, sondern auch vielfältige "Thread/Prozesskill" Möglichkeiten (insbesondere bei MASM "Experimenten" oder Reverseengineering/Debugging nützlich, um mal Anwendungen oder bestimmte Thread einzufrieren).
Wenn eine Datei unerklärlicherweise in Benutzung ist und sich daher nicht löschen/modifizieren lässt, kann man im PE nach allen offenen Handles zu der Datei suchen und diese schließen, ohne die dazugehörige Anwendung beenden zu müssen.
http://www.microsoft.com/germany/technet/sysinternals/utilities/ProcessExplorer.mspx

Edit:
Also: erstmal: 16-Bit ASM mit Segmenten usw. habe ich nie ernsthaft gemacht. Daher im Zweifelsfalle doch bitte irgendwo nachlesen ;).

Du hast wohl das COM-Beispiel erwischt.Als COM assembliert (ML /AT source.asm)
funktioniert es tadellos. Bei Exe wird es etwas fummeliger, da man bei der Adressierung noch die Segmentregister berücksichtigen und initialisieren muss.
also
Code:
mov ax,cs
mov ds,ax
mov ah, 09h

mov dx,offset HelloWorld
INT 21h
In dem Fall kann man von CS eine Kopie nach DS schieben, sauberer wäre es natürlich, wenn man noch .DATA definiert und per MOV ax, @DATA; mov DS,AX das ganze lädt.
TINY heißt eigentlich "auf 64K begrenzt". Damit lassen sich in erster Linie COMs erstellen. Warum MASM hier trotzdem eine Segmentierung haben mag - k.A
 
Danke! So funktioniert's einwandfrei.
"Hello World !!" :rolleyes:

Vieleicht wird das mit dem Tiny und der Segmentierung irgendwo im Tut noch erklärt.
 
Das liegt nicht am Modell, nach dem der Compiler und Linker das Zeug interpretieren, sondern daran, wie das OS die ausführbare Datei lädt und die Register initialisiert, wenn das Ding startet. Und das ist unabhängig von jenen Modellen.

Die Speichermodelle dienen eh nur dazu, die 16-Bit-Barriere in den 32-Bit-Bereich aufzubohren, wozu der Compiler in den "größeren" Speichermodellen die Segmentregister zweckentfremdet als höherwertige Adreßanteile behandelt. Was das EIGENTLICHE Konzept der Segmentierung damals torpediert hat. Weshalb sowohl Microsoft als auch ein gewisser Linus dieses beim Übergang zur 32-Bit-Ära über Bord geworfen hatten. Weshalb es DANN keinen Schutz vor dem Ausführen von Programmcode auf dem Stack und in Datenbereichen mehr gab. Was dazu führte, daß es heutzutage diese ach so netten Stack-Overflow-Exploits überhaupt als solche gibt. Sonst wären das einfache unhandled Exceptions. Was dann wiederum zu diesen hardwaremäßig (aus CPU-Sicht) vollkommen redundanten No-Execute-Bits in den Pagetables neuerer 8086-CPUs geführt hat...

Man könnte sicher noch weiter lästern, was für Aufwand erst in ein vollkommen korrektes und sicheres System gesteckt wird, um es dann erst zu verhunzen und dann zu verwerfen und dann wiederzugebären und dann die Spirale erneut anzuwerfen usw. usf...
 
Ich glaube es wird gar nicht so viel Aufwand betrieben, systeme 100% sicher zu machen. Dabei würde der Nachfolger seine Relevanz verlieren. Denn wer will ein neues System, wenn das Alte 100% sicher ist? Große Konzerne würden dann auf jeden Fall das Alte nehmen, da es zuverlässiger ist.
Vorallem bei M$ ist das doch ein springender Punkt, oder? Die wollen ja mit Window$ mächtig komerz machen.
Das Linux bei der Sache mit zieht, ist doch klar, weil 32bit auch eine größere Bandbreite an Möglichkeiten bietet.

Nun aber back2topic: (oder back2offTopic?)
Ich glaube ich habe glaube ich schon wieder ein technisches Problem, denn der Code ist afaik astrein.
Es geht um lodsb und stosb. Diese Funktionen tun bei mir scheinbar nichts. Hier mein Beispielccode: (Habe auch schon andere probiert, welche auch nicht funktionierten)
Code:
.model tiny ;nur ein kleines Programm
.code ;hier fängt der code an
;Muss ich hier noch angeben, was für ne Datei es werden soll?

START:
mov ax, cs
mov ds, ax 

mov cx, 9d          ;Zähler auf 9
mov si, offset msg1 ;laden des Offsets in SI
mov di, si          ;Ziel = Quelle

Crypt:     ;Schleife
lodsb      ;das erste Byte in ax
inc al     ;vermindern um 1
stosb      ;speichern es wieder
loop Crypt ;das ganze 9 mal

Write:
lea dx, MSG1
mov ah, 9h   ;nun zeigen wir die entschlüsselte
int 21h      ;Nachricht auf dem Bildschirm..

ENDE:

mov ah,4ch ;4Ch zum Beenden
INT 21h

MSG1 db 'BCDEFGHIJ'
StringEnde db 10d,13d,'$'

END START
Selbst wenn ich lodsb und stosb den Parameter MSG1 geben wird immer die Ausgangsnachricht angezeigt. Ich habe auch schon versucht, in der Schleife jedes Zeichen einzelnd anzuzeigen -> Ich schlussfolgere, dass lodsb auf jeden Fall nichts tut, denn es stehen nur wirre Daten in den a Registern.

Edit: Habe wegen dem ganzen ASM bezogenen Posts mal den Thread Titel geändert.
Edit2: Zu Recht gemoved, da es ziemlich off-topic wurde.
 
OT
Hm, so wie Harry habe ich das gar nicht betrachtet. Bzw. in den ganzen Büchern/Tutorials steht praktisch nur, dass Segmente "extra" für den erweiterten Speicherzugriff erfunden wurden (zumindest von der Idee her).
So gesehen hat man logischerweise einige "Superfeatures" schon mitgeliefert: führe als OS nur CS-Adressbereiche aus(bzw. "halte die Segmente auseinander", was als OS nicht so schwer sein dürfte) und schon sind Heap/Stackoverflows nicht möglich. Die ganze Stack-Randomisierung und Stack-"Checks"/"Aufblähung" (welche von gcc gerne betrieben wird) wird unnötig.
Hab mir mal höchstens die Frage gestellt, warum Windows überhaupt Segmente nutzt (Thread Execution Block ist über FS erreichbar).

Zum Thema: laut der Dokumentaion muss wird bei stosb nach ES:DI geschrieben
http://www.i8086.de/asm/8086-88-asm-stosb.html
d.h wenn ich in deinem Code ES initialisiere:
Code:
mov ax,cs
mov es,ax
klappt es auch ;)
Also: lodsb liest von DS:SI, stosb schreibt nach ES:DI
dabei sollte man noch den DF (Direction Flag) berücksichtigen, wenn dieser bei der Operation gesetzt ist ( per STD), wird nach der Operation anschließend DI/SI decrementiert und bei gelöschtem Flag per CLD) incrementiert.
 
Zurück
Oben