Assembler für Anfänger

megatron

Vice Admiral Special
Mitglied seit
27.03.2003
Beiträge
999
Renomée
0
Hab irgendwie leichtfertig nen Kurs in Assemblerprogrammierung belegt und hab nun ein kleines Problem damit.
Konkret mit einer wahrscheinlich recht einfachen Aufgabe...
Es geht darum eine Zahl als String in einem kleinen C-Programm einzulesen, diese dann an eine Assember-Datei zu übergeben, in der die Länge des String ermittelt wird. Danach soll das ganze in eine BCD-Zahl umgewandlt werden die wiederum als String zurück gegeben wird.
Gegeben ist folgendes Beispiel:
"3514622130" sollte im Hexdump 00 00 00 00 00 35 14 62 21 30 liefern

Nach einigem rumprobieren funktioniert zumindest schonmal das ermitteln der Stringlänge bei vorgegebenen Arrays als String (char[])
Sobald ich aber mit printf oder scanf im Main anfange schwankt das ganze zwischen wirren Returnwerten und Speicherzugriffsfehlern.
Hat zufällig einer Ahnung was da wie zu machen ist?
 
Ich kenn mich mit den Zahlenformaten leider nicht so wirklich aus (bei signed/unsigned integer nach big/little endian hörts auf :]... a bisserl Float kenn ich auch noch).

Schau mal im Netz nach "The Art of Assembly Language" - das Assemblerbuch überhaupt. Kostenlos :)

Schreib einfach mal wie so eine BCD Zahl auszusehen hat, vielleicht kann ich dir dann weiterhelfen - bin bis Sonntag Abend aber net da.

Ach ja - 8086, 386 Real Mode oder 386 Protected Mode Assembler?
 
AFAIR wird bei den BCD jeweils ein Nibble zur Darstellung der zehn Ziffern des Dezimalsystems verwendet, d.h. 0x0 bis 0x9 stellen die dezimalen Ziffern 0..9 dar, 0xA..0xF bleiben ungenutzt. D.h. 10 würde man in BCD als 0x10 darstellen etc.
 
Speicher- und Zugriffsfehler hört sich für mich erstmal nach unsachgemässem Gebrauch von scanf an. Dort muss immer die Adresse der Variablen stehen, in die die Daten eingelesen werden.

Beispiel:
Code:
int A;
scanf("%d",&A);

Nur um hier fundamentale Probleme auszuschließen.

exr
 
Original geschrieben von megatron
Nach einigem rumprobieren funktioniert zumindest schonmal das ermitteln der Stringlänge bei vorgegebenen Arrays als String (char[])
Sobald ich aber mit printf oder scanf im Main anfange schwankt das ganze zwischen wirren Returnwerten und Speicherzugriffsfehlern.
Hat zufällig einer Ahnung was da wie zu machen ist?
Ich hoffe, Dein String ist mit '\0' terminiert! Wenn nicht, dann wundern mich die Fehler im Zusammenhang mit printf/scanf überhaupt nicht.
 
Original geschrieben von Sargnagel
Ich hoffe, Dein String ist mit '\0' terminiert! Wenn nicht, dann wundern mich die Fehler im Zusammenhang mit printf/scanf überhaupt nicht.

Haha! Das erzeugt immer die coolsten Fehler. Da schreibt man zwei Strings in den Speicher, wobei einer nicht mit '\0' abgeschlossen ist. Ergebnis: beim Ausgeben des ersten Strings hängt der zweite hinten an. Wenn man da nicht sofort drauf kommt, dass das '\0' fehlt, kann man ganz schön viel Zeit damit verbringen nach der Lösung zu suchen! ;)

exr
 
1. hast du beim übergeben beachtet den base pointer zu retten .. etc.
2. wie beschreibst du den string ? normal ist das ja eine anordung von zeichen, welchen dann in hex scheibweise, ganz andere hexgrößen haben => ascii
 
hehe nochmal,
1. brauchst du nicht wenn du mit inline assembler arbeitest
praktisch wäre zB in einen extra c file
 
Hast du denn getestet, ob die Übergabe des Strings an das Assembler-Programm korrekt funktioniert?
 
Hab mittlerweile nochmal so gescahut - ich glaub ich hab da bissle was vergessen gehabt - sowas wie cld ist gewiss nicht verkehrt ;D
Ich musste feststellen dass der Prof da während der Übung sogar weitere Tips gegeben hatte. "Dummerweise" war ich da irgendwie eher abwesend...
Aber thx für die vielen Antworten - ich sollte hier vielleicht doch ab und an mal vorbei schauen ;)
 
Zurück
Oben Unten