Assembler: merkwürdige Sprünge

Pascal, Basic und andere nicht aufgelistete
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Assembler: merkwürdige Sprünge

Beitrag von canlot » Sa Dez 26, 2015 11:41 pm

Hallo alle zusammen und frohe Weihnachten :)
Ich habe ein kleines Assembler Programmchen was mir den Kopf zerbricht, vielleicht sehe ich nur den Fehler nicht.
Es ist 16-Bit masm Assembler, was ich sehr gut finde zum lernen und weil ich das Buch besitze "Assembler Programmierung" von Wolfgang Link.
Nun zum eigentlichen Problem.

Code: Alles auswählen

.model small
.stack 256
.code
mov cl, 1
mov ch, 2
mov ah, 08h ;lese Tastatureingaben
int 21h ;speichere in al
schleife:
add al, cl
mov dl, al
mov ah, 02h ;von dl
int 21h ;zeige auf dem Bildschirm
cmp al, ch
jae schleife
raus:
mov ah, 08h
int 21h
mov ah,4ch
int 21h
end
Ich lese ein Zeichen ein, das wird in AL gespeichert, zu AL wird CL addiert und auf dem Bildschirm ausgegeben. Ich vergleiche dann und springe wenn CH größer ist als AL. Bei CMP werden ja Register subtrahiert und die Flags gesetzt aber die REGISTERINHALTE BLEIBEN JA GESPEICHERT(???), aber das komische ist, es ist egal was ich in CH gespeichert habe ob 2 oder 23 oder eine andere Zahl. Es ist die Art mit der ich vergleiche wenn ich JAE oder JA habe dann bekomme ich über 100 Zeichen wenn ich z.B. die 1 eingeben alles ab der 1 wie 2345678... usw. ich glaube bis zum Ende des 255 bit 2^8 Bereichs. Wenn ich aber JB habe dann wird mir nur CL draufaddiert was ja prinzipiell richtig ist, es erfolgen aber keine Sprünge d.h. ab der ersten Zahl ist es Schluss.
edit: es erfolgen auch keine Sprünge auch wenn ich in CH eine 23 habe(getestet)

Hoffe das ist einigermaßen verständlich :D wahrscheinlich habe ich weil ich so Müde bin ein Register übersehen oder sonstiges, ich bin aber schon min. 4 Mal das Programm durchgegangen und finde dort nichts.
Danke und schöne Feiertage :)
Unwissenheit ist ein Segen

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Assembler: merkwürdige Sprünge

Beitrag von nufan » So Dez 27, 2015 2:47 am

Ohne es getestet zu haben würde ich behaupten du hast bei ch vergessen das ASCII Encoding der Zahlen zu berücksichtigen. Der entstehende Overflow würde auch das von dir beschriebene Verhalten erklären.

Die Entscheidung 16bit Programme unter Windows zu schreiben finde ich übrigens irgendwie seltsam. Gibts einen Grund dafür (abgesehen vom Buch)?

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Assembler: merkwürdige Sprünge

Beitrag von canlot » So Dez 27, 2015 12:01 pm

nufan hat geschrieben:Ohne es getestet zu haben würde ich behaupten du hast bei ch vergessen das ASCII Encoding der Zahlen zu berücksichtigen. Der entstehende Overflow würde auch das von dir beschriebene Verhalten erklären.
Okay, das heißt dass ich statt eine 2 Dezimal eine 50 Dezimal was ja eine 2 in ASCII ist, geladen habe? Wenn auf eine 2 eine 1 addiert wird, kommt dann nicht eine 3 raus sondern 49 + 50 = 99 raus.
Wie sage ich explizit dass ich eine 2 bzw 1 dezimal möchte? Etwa so mov ch, 01d ? Wie wird dann eine 23 repräsentiert? Oder weil sie nicht im ASCII Code ist, wird sie dezimal gespeichert?
Weil wenn ich mit 23 vergleiche kommt das gleiche raus.

Fragen über Fragen :D danke für die Antwort, werde mich gleich zum testen hinsetzen.
nufan hat geschrieben:Die Entscheidung 16bit Programme unter Windows zu schreiben finde ich übrigens irgendwie seltsam. Gibts einen Grund dafür (abgesehen vom Buch)?
Ja ich habe das Buch was ich gerne durcharbeiten möchte. Ich habe auch schon 32bit Assembler Programme geschrieben aber ich habe keine gute Anleitung gefunden wie ich Std calls benutze. Außerdem reicht 16bit erstmal, ist kleiner und kompakter und vermittelt die Grundlagen genauso gut wenn nicht besser, beschränkt man sich nur auf das wesentliche.
Ich fange mit 32 an wenn ich das Buch durch habe.
Unwissenheit ist ein Segen

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Assembler: merkwürdige Sprünge

Beitrag von nufan » So Dez 27, 2015 2:19 pm

canlot hat geschrieben:
nufan hat geschrieben:Ohne es getestet zu haben würde ich behaupten du hast bei ch vergessen das ASCII Encoding der Zahlen zu berücksichtigen. Der entstehende Overflow würde auch das von dir beschriebene Verhalten erklären.
Okay, das heißt dass ich statt eine 2 Dezimal eine 50 Dezimal was ja eine 2 in ASCII ist, geladen habe?
http://www.ctyme.com/intr/rb-2561.htm
Ja.
canlot hat geschrieben:Wenn auf eine 2 eine 1 addiert wird, kommt dann nicht eine 3 raus sondern 49 + 50 = 99 raus.
Wenn du wirklich eine ASCII '1' dazuaddierst ja, aber das machst du ja in deinem ursprünglichen Code nicht.
canlot hat geschrieben:Wie sage ich explizit dass ich eine 2 bzw 1 dezimal möchte? Etwa so mov ch, 01d ?
Du verwendest ja in deinen mov Instruktionen die dezimalen Werte. Aber das was du durch den read-Interrupt bekommst ist ASCII.
canlot hat geschrieben:Wie wird dann eine 23 repräsentiert? Oder weil sie nicht im ASCII Code ist, wird sie dezimal gespeichert?
Es gibt kein Zeichen '23'. Du musst deine Zahl als String einlesen und in einen Integer umwandeln. So wie es eben atoi() oder scanf() machen.
canlot hat geschrieben:
nufan hat geschrieben:Die Entscheidung 16bit Programme unter Windows zu schreiben finde ich übrigens irgendwie seltsam. Gibts einen Grund dafür (abgesehen vom Buch)?
Ja ich habe das Buch was ich gerne durcharbeiten möchte. Ich habe auch schon 32bit Assembler Programme geschrieben aber ich habe keine gute Anleitung gefunden wie ich Std calls benutze. Außerdem reicht 16bit erstmal, ist kleiner und kompakter und vermittelt die Grundlagen genauso gut wenn nicht besser, beschränkt man sich nur auf das wesentliche.
Ich fange mit 32 an wenn ich das Buch durch habe.
Ich kann das nur sehr empfehlen (Linux):
http://www.amazon.de/dp/0470497025/

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Assembler: merkwürdige Sprünge

Beitrag von canlot » So Dez 27, 2015 6:15 pm

nufan hat geschrieben: canlot hat geschrieben:
Wie sage ich explizit dass ich eine 2 bzw 1 dezimal möchte? Etwa so mov ch, 01d ?

Du verwendest ja in deinen mov Instruktionen die dezimalen Werte. Aber das was du durch den read-Interrupt bekommst ist ASCII.
Ah, okay das war mein Fehler, danke dir.
nufan hat geschrieben:canlot hat geschrieben:
Wie wird dann eine 23 repräsentiert? Oder weil sie nicht im ASCII Code ist, wird sie dezimal gespeichert?

Es gibt kein Zeichen '23'. Du musst deine Zahl als String einlesen und in einen Integer umwandeln. So wie es eben atoi() oder scanf() machen.
Nein, ich meinte wenn ich sie in das Register lade wie mov ch, 23 wird sie, weil es ja zwei Zeichen sind dezimal gespeichert, was aber sowieso passiert.
nufan hat geschrieben:Ich kann das nur sehr empfehlen (Linux):
http://www.amazon.de/dp/0470497025/
Hm, danke, aber so viel Zeit habe ich nicht, so viele Bücher zu lesen :D
Unwissenheit ist ein Segen

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Assembler: merkwürdige Sprünge

Beitrag von nufan » So Dez 27, 2015 6:28 pm

canlot hat geschrieben:
nufan hat geschrieben:Ich kann das nur sehr empfehlen (Linux):
http://www.amazon.de/dp/0470497025/
Hm, danke, aber so viel Zeit habe ich nicht, so viele Bücher zu lesen :D
Umso wichtiger ist es sich die richtigen Bücher auszusuchen... ^^

Antworten