Assembler-Quiz

Smalltalk
Antworten
mampfi
Beiträge: 1983
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Assembler-Quiz

Beitrag von mampfi » 03.11.2024 18:36:03

Anbei mal ein kleines Assambler-Quiz, Achtung nicht zu kompliziert denken, aber auf jedes Wort achten:

Software-Interrupt: Zeichen ´A´ ausgeben.

mov ah, 02
mov dl, 41
int 21h rem DOS-Interrupt Zeichen ausgeben
int 20

Dürfte mit dem nasm unter Linux nicht funktionieren. :twisted:
Es gibt viele Foren und eine Welt ausserhalb

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Assembler-Quiz

Beitrag von Livingston » 03.11.2024 18:45:16

Falls Du ein BIOS-System hast (kein UEFI):
Erst runterschalten auf Real-Mode, Videokarte umschalten, "A" ausgeben... und zusehen, dass ab jetzt nix mehr geht :twisted:
Und das rem würd ich noch durch ";" ersetzen. Aber das war's dann wirklich.
Hexadezimal statt dezimal schadet bestimmt auch nicht.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

mampfi
Beiträge: 1983
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: Assembler-Quiz

Beitrag von mampfi » 03.11.2024 18:51:25

Das rem ist kein nasm, stimmt.

Es ist aber, wenn mans weiß, ein ganz banaler Grund, wenn man´s weiß. ;-)
Es gibt viele Foren und eine Welt ausserhalb

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Assembler-Quiz

Beitrag von Livingston » 03.11.2024 18:56:14

Interrupt 21h
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

mampfi
Beiträge: 1983
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: Assembler-Quiz

Beitrag von mampfi » 03.11.2024 18:59:37

Das werte ich als lösung. :THX:

Der MS-DOS-Interrupt 21h dürfte unter Linux nicht funktionieren, ich habs allerdings nicht eingegeben.
Es gibt viele Foren und eine Welt ausserhalb

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Assembler-Quiz

Beitrag von Livingston » 03.11.2024 19:30:35

Interrupt 21h geht unter Linux wahrscheinlich ins Leere, sicher aber nicht zu irgendwas Brauchbarem.
Nebstbei: Der Versuch, irgendwas anderes als int80h aufzurufen, wird vom Kernel sofort bestraft. Der 80er ist der einzige, den ein User (und auch root) unter Linux nutzen darf. Alle anderen führen zu einer Exception wegen mangelnder Privilegien. Interrupt 80h war [*] die Schnittstelle zum Kernel (syscall), was am ehesten dem int21h aus DOS nahekommt.

[*] Wird heute zwar nicht mehr von libc und Co verwendet, weil zu langsam und träge, ist aber wohl immer noch eine Möglichkeit, den Kernel anzusprechen.

NACHTRAG:
Ein paar gaaanz einfache Beispiele für die Kernelschnittstelle sehen so aus: https://www.tutorialspoint.com/assembly ... _calls.htm
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

mampfi
Beiträge: 1983
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: Assembler-Quiz

Beitrag von mampfi » 04.11.2024 10:41:40

Ich hab´s jetzt mal spaßeshalber eingegeben, die Fehlermeldung gibt aber keinen Hinweis auf den falschen Interrupt:

-----------------------------------
%include "io64.inc"

section .text
global CMAIN
CMAIN:
;write your code here
mov ah, 02
mov dl, 41h
int 21h
int 20h
-----------------------------------

5131
Es gibt viele Foren und eine Welt ausserhalb

mampfi
Beiträge: 1983
Registriert: 16.08.2005 18:15:29
Lizenz eigener Beiträge: GNU General Public License
Wohnort: münchen

Re: Assembler-Quiz

Beitrag von mampfi » 04.11.2024 10:56:49

Livingston hat geschrieben: ↑ zum Beitrag ↑
03.11.2024 19:30:35
Interrupt 21h geht unter Linux wahrscheinlich ins Leere, sicher aber nicht zu irgendwas Brauchbarem.
Nebstbei: Der Versuch, irgendwas anderes als int80h aufzurufen, wird vom Kernel sofort bestraft. Der 80er ist der einzige, den ein User (und auch root) unter Linux nutzen darf. Alle anderen führen zu einer Exception wegen mangelnder Privilegien. Interrupt 80h war [*] die Schnittstelle zum Kernel (syscall), was am ehesten dem int21h aus DOS nahekommt.

[*] Wird heute zwar nicht mehr von libc und Co verwendet, weil zu langsam und träge, ist aber wohl immer noch eine Möglichkeit, den Kernel anzusprechen.

NACHTRAG:
Ein paar gaaanz einfache Beispiele für die Kernelschnittstelle sehen so aus: https://www.tutorialspoint.com/assembly ... _calls.htm
Danke, gespeichert in "livingston_assembler_link.txt" für weiteres Surfen :THX:
Es gibt viele Foren und eine Welt ausserhalb

Benutzeravatar
Livingston
Beiträge: 1816
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Assembler-Quiz

Beitrag von Livingston » 04.11.2024 11:19:03

mampfi hat geschrieben: ↑ zum Beitrag ↑
04.11.2024 10:41:40
Ich hab´s jetzt mal spaßeshalber eingegeben, die Fehlermeldung gibt aber keinen Hinweis auf den falschen Interrupt:
Der Assembler macht keine Annahmen von der Umgebung, es wird einfach nur ausgeführt, was Du ihm vorgibst. Da int ein regulärer Befehl ist, wird er natürlich ausgeführt. Wenn aber der Interrupt-Vektor ins nichts/auf was nicht Lauffähiges zeigt oder dem User untersagt ist, diesen Interrupt aufzurufen, dann knallt's eben zur Laufzeit.
Unter Linux kommt hinzu, dass sich die Interrupt-Vektoren nicht da befinden, wo Du sie unter DOS findest, zudem sind sie anders aufgebaut. Dann noch die User-Rechte: Du darfst nicht alles machen, was unter DOS ging. Der Kernel ist der Boss und teilt ein, was eine privilegierte Aktion ist (Kernel darf jeden Befehl aufrufen), und was unter User-Rechten läuft (User darf nicht jeden Befehl nutzen, darf nur an zugewiesenen Adressen schnüffeln und vieles andere).
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Antworten