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 operandsja 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 textIn 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 specifiedund 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!!!!