Seite 1 von 1

Assembler-Quiz

Verfasst: 03.11.2024 18:36:03
von mampfi
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:

Re: Assembler-Quiz

Verfasst: 03.11.2024 18:45:16
von Livingston
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.

Re: Assembler-Quiz

Verfasst: 03.11.2024 18:51:25
von mampfi
Das rem ist kein nasm, stimmt.

Es ist aber, wenn mans weiß, ein ganz banaler Grund, wenn man´s weiß. ;-)

Re: Assembler-Quiz

Verfasst: 03.11.2024 18:56:14
von Livingston
Interrupt 21h

Re: Assembler-Quiz

Verfasst: 03.11.2024 18:59:37
von mampfi
Das werte ich als lösung. :THX:

Der MS-DOS-Interrupt 21h dürfte unter Linux nicht funktionieren, ich habs allerdings nicht eingegeben.

Re: Assembler-Quiz

Verfasst: 03.11.2024 19:30:35
von Livingston
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

Re: Assembler-Quiz

Verfasst: 04.11.2024 10:41:40
von mampfi
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

Re: Assembler-Quiz

Verfasst: 04.11.2024 10:56:49
von mampfi
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:

Re: Assembler-Quiz

Verfasst: 04.11.2024 11:19:03
von Livingston
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).