ADD in NASM funtzt irgendwie net!



  • Hi,

    ich bin noch krasser anfänger in assembler!

    Ich habe folgenden Code eingegeben und assembliert:

    BITS 16
    ORG 0x100
    
    jmp _main
    
    zahl db 0
    
    _main:
            mov zahl,0
            add zahl,4
    
            mov ah,9
            mov dx,zahl
            int 21h
    
            mov ax,4Ch
            int 21h
    


  • Ach ganz vergessen:

    myfiles\test.asm:9: invalid combination of opcode and operands
    myfiles\test.asm:10: invalid combination of opcode and operands

    ja das ist die fehlermeldung vom nasm! was ist jetzt falsch??

    ich habe diesen code aus dem Buch 'Programmiersprache Assembler - EINE STRUKTURIERENDE EINFÜHRUNG' "herausgefiltert".

    Danke im voraus
    IDK



  • Spätestens beim 1. Interrupt-call würdest sowieso eine Überraschung erleben.
    statt 4 würde er irgendwelchen ASCII Schrott ausspucken.
    int 21h
    ah = 9
    dx = OFFSET text

    In dx müsste das OFFSET, die Adresse deiner Variable stehen, bei deiner Version wird einfach Zahl als OFFSET genommen, da kommt meistens ungesundes raus.
    Nehmen wir mal an, es steht das Offset drinn, würde der INT21 dann nicht einfach das ASCII Zeichen 4 (Karo) ausgeben, und alles danach, bis er eine Terminierung (ASCII 36 soweit ich weiss) findet?

    mfg
    Noob



  • BITS 16
    ORG 0x100
    
    jmp _main
    
    zahl db 0
    
    _main:
            mov [zahl],0
            add [zahl],4
    
            ;mov ah,9
            ;mov dx,zahl
            ;int 21h
    
            mov ax,4Ch
            int 21h
    


  • Original erstellt von noob:
    In dx müsste das OFFSET, die Adresse deiner Variable stehen, bei deiner Version wird einfach Zahl als OFFSET genommen, da kommt meistens ungesundes raus.

    Kann es sein, dass Du hier den MASM/TASM-Syntax mit dem NASM-Syntax verwechselst?
    Diese Zeile war schon richtig, aber wie der Compiler richtig festgestellt hat, waren die Zeilen 9 und 10 nicht korrekt.
    Die hat Phreaking aber schon berichtigt 😉
    Wie aber noob schon festgestellt hat, wuerde bei dieser ganzen aktion eh nichts sinnvolles rauskommen. (eben wie gesagt eine Raute und weiterer ASCII-Schrott)
    Die Funktion 9 vom int 21h ist dazu gedacht, mit "$" terminierte strings auf den Bildschirm zu schreiben.

    Wenn Du eine Zahl (z.B. im Hexadezimalsystem) auf dem Bildschirm ausgeben willst, musst Du sie zuerst in einen String umwandeln. Hier ein (billiges) Beispiel:

    BITS 16
    ORG 0x100
    
    _main:
            ;mov [zahl],0 ;nicht unbedingt noetig, da zahl schon 0 ist
            add byte [zahl],4 ;0+4...
    
            ;zahl in eine Hex-zahl umwandeln, die auf dem Bildschirm ausgegeben werden kann...
            mov ah,[zahl]
            xor bx,bx
            mov bl,ah
            ;1 Ziffer im Hex-system hat 4 bit...
    
            shr bl,04h ;erstmal nur obere 4Bit von "zahl" verarbeiten... (1.Ziffer)
            mov al,[HexZiffern+bx]
            mov [AString],al
            mov bl,ah
            and bl,0Fh ;untere 4bit verarbeiten (2. Ziffer)
            mov al,[HexZiffern+bx]
            mov [AString+1],al
            mov byte [AString+2],"$" ;string abschliessen, damit wirklich nur die Zahl
            ;ausgegeben wird.
    
            mov ah,9
            mov dx,AString ;Bei Variablen-Name OHNE eckige Klammern, wird das Offset uebergeben!
            int 21h
    
            mov ax,4Ch
            int 21h ;beenden...
    
    zahl db 0
    HexZiffern db "0123456789ABCDEF" ;vereinfacht die Umwandlung von "zahl"
    AString : resb 10h ;leeren Speicherplatz reservieren
    


  • Ich kapier des jetzt alles net so ganz!

    hier mein aktueller code:

    BITS 16
    ORG 0x100
    
    jmp _main
    
    zahl db 0
    
    _main:
            mov [zahl],0
            add [zahl],4
    
            mov ax,4Ch
            int 21h
    

    So jetzt kommen folgende Fehlermeldungen:

    myfiles\test.asm:9: operation size not specified
    myfiles\test.asm:10: operation size not specified

    und jetzt??



  • BITS 16
    ORG 0x100
    
    jmp _main
    
    zahl db 0
    
    _main:
            mov byte [zahl],0
            add byte [zahl],4
    
            mov ax,4Ch
            int 21h
    


  • Ok es klappt danke!!!!

    aber kann ich das kompliziert umrechen auch irgendwie übergehen?? ich versteh den code einfach net!



  • Mensch sollte idealerweise die Int2Str Funktion auch als Funktion implementieren, aber wenn du nur eine(!!!) Ziffer (dezimal) ausgeben willst kannst du es auch einfacher haben:

    BITS 16
    ORG 0x100
    
    ;code:
    
    ; arithmetischer schnick-schnack mit [Ziffer]
    mov byte [Ziffer], 0 ;ist an sich überflüssig,
                         ;da die Daten bereits initialisiert sind
    add byte [Ziffer], 4
    
    ; nun die Ausgabe mit Funkt. 09h von int 21h
    mov al, [Ziffer]
    add [Msg], al
    
    mov ah, 09h
    mov dx, Msg
    int 21h
    
    ;beenden:
    mov ax, 4Ch
    int 21h
    
    ;data am Ende, dann kann mensch sich den jmp sparen =)
    Ziffer  db 0
    Msg     db "0$"
    

    Hier wird auf "0" also den Wert 48 (entspricht "0" im ASCII-Code) der Wert von Zahl addiert. Dafür darf dann in Zahl aber kein Wert > 9 stehen!

    mfg
    -bg-



  • OK, damit muss ich mich halt abfinden (>9), naja also danke!!!!


Anmelden zum Antworten