Speichern und Inkrementieren integer-Variablen in x86 Assembler MASM
Ich versuche zu verstehen Versammlung. Das heutige Thema ist: "Speichern und Inkrementieren int-Variablen und drucken von zahlen" 🙂
So, hier ist mein code
dane segment
count db 0
dane ends
code segment
start:
inc byte ptr ds:[count]
inc byte ptr ds:[count]
inc byte ptr ds:[count]
mov dl,ds:[count]
mov ah,2
int 21h
mov ah,4ch
int 21h
code ends
end start
Wenn ich kompilieren und ausführen, bekam ich diese Fehlermeldung:
Es geschieht nur, wenn count
wird erhöht, mehr als einmal.
Was mache ich?
Kann jemand erklären, warum kann ich nicht einfach schreiben:
inc count
Auch, warum ich byte ptr
beim Inkrementieren Werte, aber nicht, wenn ich es kopieren zu dl
registrieren?
- Ich weiß nicht, über diese Versammlung,aber sind Sie sicher, dass Sie nicht Inkrementieren eines Zeigers statt mit dem Wert im Register? diese Fehlermeldung scheint heap-Beschädigung..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Edit: umgeschrieben und Hinzugefügt, text, code Hinzugefügt (funktioniert in MASM 6.11):
X86 assembbly müssen Sie die Größe des memory-Operanden für Instruktionen, in denen es wäre Mehrdeutigkeit sonst. Sie haben zu sagen, das assembler die Größe des Operanden mit
byte ptr
,word ptr
etc. Aus diesem Grundinc byte ptr ds:[count]
mussbyte ptr
.inc word ptr ds:[count
ist andere Weisung.mov dl,ds:[count]
müssen nichtbyte ptr
, weildl
ist ein 8-bit register ist und daher die Größe des memory-operand ist immer der gleiche, ein byte (8 bits).Um Zeichen zu drucken, müssen Sie zuerst konvertieren Sie die Zahl in eine Zeichenkette (oder ein einzelnes Zeichen für zahlen kleiner als 10). Ansonsten sind Sie Druck-steuerzeichen ETX (siehe ASCII-Tabelle), der ASCII-code 3. Für zahlen kleiner als 10, Druck in dezimal trivial ist, fügen Sie einfach '0' (
30h
), wie diese:Druck in dezimal-in x86-assembly ist eine fragte ganz oft, siehe zum Beispiel Ist dieser code korrekt (Zahl plus Zahl, dann drucken Sie das Ergebnis) auf die Idee kommen.
Edit: EXE-Dateien, die müssen auch eine stack-segment.
DOS-EXE-Dateien brauchen, um einen stack-segment. Montage mit MASM 6.11 gibt keine Warnungen oder Fehler, die im Grunde mit
dosexe.asm
(ersetzen dosexe.asm auf Ihre Assembler-code-Datei-name).Aber die Verknüpfung mit ML (
ml dosexe.obj
) gibt die folgende Warnung:So, ein stack-segment Hinzugefügt werden muss, fügen Sie die folgenden Zeilen oben in die Quelle.
Gab es auch einige problem mit Daten-segment-definition, fixiert, dass ich zu.
Die gesamte Feste Assembler-code könnte so etwas wie dieses (funktioniert in MASM 6.11):
nasm
tag. Aber mit MASM, die Sie verwenden müssen MASM-syntax, sowieso. Ich habe nicht verwendet MASM vor, aber ja, ich fixe die bugs und es jetzt montiert und links ohne Probleme in MASM 6.11, und druckt die gewünschte Ausgabe (für alle nicht signiertencount
Wert im Bereich von 0...255).[quote]mov dl,ds:[Wert] nicht brauchen, byte ptr, denn dl ist ein 8-bit register ist und daher die Größe des memory-operand ist immer der gleiche, ein byte (8 bits).[/quote]
Sowie zusätzliche diese operation nicht brauchen, ein segment-override-Präfix, weil DS ist das Standard-segment der operation. => mov dl,[count]
Edit:
Definiert eine Programm-segment genannt-Namen mit segment-Attribute
http://msdn.microsoft.com/de-de/library/d06y3478%28v=vs.80%29.aspx
Beispiel für die Verwendung von segment-Namen:
Wie die Verwendung von Segmenten und Richtlinien:
http://cs.smith.edu/~thiebaut/ArtOfAssembly/CH08/CH08-3.html
...
Für die Verknüpfung eines 16-bit-Anwendung mit MASM 6 wir brauchen einen anderen linker.
ftp://ftp.microsoft.com/softlib/mslfiles/lnk563.exe
Dirk