[MASM32] Probleme mit INT 21h und offset



  • Hallo!

    Ich habe folgenden Code:

    .386
    .model flat, stdcall
     option casemap :none
    .data
       text  db    "Hello World",0 
    .code
    org 100h
    start:
    mov ah, 09h
    mov dx,offset text ;<-- "instruction operands must be the same size"
    INT 21h
    
    mov ah,4ch
    INT 21h
    
    end start
    

    kann mir jemand sagen, wie ich ein "Hallo-Welt"-Programm erstelle, ohne hässliche Windows-Libs zu verwenden?

    Außerdem stürzt mein Programm bei dem Befehl "INT 21h" immer ab. Egal
    welche werte ich gegeben habe etc.

    😕

    Man merkt bestimmt, dass ich (noch) ein Noob bin, was ASM angeht 😃



  • Auf die Schnelle hab ich diesen Fehler gefunden:

    text db "Hello World',0

    Das muss doch bestimmt

    text db "Hello World $"

    heissen.

    (http://spike.scu.edu.au/~barry/interrupts.html#ah09)

    DOS INT 21h - DOS Function Codes

    AH = 09h - WRITE STRING TO STANDARD OUTPUT

    Entry: DS:DX -> '$'-terminated string

    Return: AL = 24h

    //edit

    Ändere

    mov dx, offsett text

    zu

    lea dx, text



  • Danke für die Antwort!

    Das Gänsefüßchen hab ich nur flasch kopiert. Im Code ist es richtig.

    Das mit dem offset funzt aber trotzdem noch net.

    text  db    "Hello World",0
      ...
    mov dx,offset text
    ^instruction operands must be the same size
    

    Den Fehler bekomm ich nicht raus. Was ist los 😕



  • Ok, hab ich geändert.
    Wenn ich nur INT 21h lasse, kann ich assemblieren und ausführen.

    Leider meldet dann XP, dass das Programm beendet werden muss...

    Wenn ich in DOS INT 21h ändere, kommt ein Syntax-error



  • Ich merke gerade...
    Egal, welchen Code ich einsetzte, das Progg stzürzt beim Start immer ab. Auch wenn im Codesegment keine Befehle stehen. Kann mir das einer erklären 😕

    😡



  • Hi,

    Was du da schreibst, sieht wie eine Win32-Anwendung aus (.model flat). Ich nehme mal an, du erzeugst daraus auch eine Win32-Anwendung.
    Nun kennt Windows allerdings so von sich aus keine DOS-Funktionen. Klar, dass dein Programm abstuerzt, wenn du trotzdem versuchst, (nicht vorhandene) DOS-Funktionen aufzurufen (dazu bitte auch nochmal einen Blick in die FAQ riskieren - Unterschiede DOS/Konsole).

    Der Fehler mit der falschen Operandengroesse ruehrt wohl daher, dass in Win32-Programmen so ein Offset normalerweise 32Bit gross ist. Auch klar, dass sich der Assembler beschwert, wenn du versuchst, eine 32Bit-Konstante in ein 16Bit-Register zu quetschen.

    Auch klar sollte sein, dass dein Programm abstuerzt, wenn du einfach gar nichts reinschreibst, bzw. es nicht vernuenftig beendest. In diesem Fall wird naemlich mit grosser Wahrscheinlichkeit einfach noch im Speicher verbliebener Datenmuell "gestartet".

    ==> Entscheide dich, was du eigentlich schreiben willst: Ein Windows- oder ein DOS-Programm. Beides gleichzeitig geht nicht so einfach. 😉



  • Naja, um ganz ehrlich zu sein...
    Eigentlich wollt ich weder ein Win32, noch DOS-16 Programm schreiben.

    Ich wollt ein von Diskette / CD bootfähiges Programm schreiben. Man könnte
    auch sagen, ein billiges Betribssystem 😞

    Aber ich glaube, das lass ich mal besser...

    ...oder weiß jemand, wie das geht?



  • Dann kannste die DOS-INT's vergessen.


Anmelden zum Antworten