Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Probleme im Programmieren in Assembler

TheWebWasher / 5 Antworten / Baumansicht Nickles

Hallo Leute,


ich hoffe einer von euch kann mir helfen ich habe in der Techniker-Schule ein programm geschrieben in Assembler Sprache. Da wir da erst am Anfang sind fangen wir ganz klein an...


Das Programm liest einen Namen ein und gibt ihn nachher wieder aus ( auch bekannt " Hello World" ) aber irgendwie macht es das nicht. Einlesen ist ja noch in Ordnung nur bei der ausgabe gibt er den ersten Buchstaben nicht aus vom Namen. Es ist ein Offset Problem. Aber ich komm nicht drauf. Hier der Quellcode:


.model tiny
.stack 100h
.data
 text_1 db "Bitte geben sie ihren Namen ein: ",0
 text_5 db 20 dup (0)
 text_3 db "Guten Tag, ",0
.code
anf:
 mov ax,@data
 mov ds,ax
 
clrscr:
 mov ax,6*256
 mov bh,0fh
 mov cx,0
 mov dx,184fh
 int 10h
 mov dx,0
 mov ah,2
 xor bh,bh
 int 10h
  
 mov si,offset text_1
l1: 
 mov dl,[si]
 cmp dl,0
 jz l2
 mov ah,2
 int 21h
 inc si
 jmp l1
 
 mov si,offset text_5
l2: mov ah,1
 int 21h
 cmp al,0dh
 jz l3
 mov [si],al
 inc si
 jmp l2
 
 
 
l3: mov si,offset text_3
 mov ah,2
 mov dl,0ah
 int 21h
 mov dl,0dh
 int 21h
 
clrscr2:
 mov ax,6*256
 mov bh,0eh
 mov cx,0
 mov dx,184fh
 int 10h
 mov dx,0
 mov ah,2
 xor bh,bh
 int 10h 
 
l4:
 mov dl,[si]
 cmp dl,0
 jz l5
 mov ah,2
 int 21h
 inc si
 jmp l4
 
l5: mov si,offset text_5
l6: mov dl,[si]
 cmp dl,0
 jz dos
 mov ah,2
 int 21h
 inc si
 jmp l6


   
dos:
 mov ah,04ch
 int 21h
 end anf 


 


Vielleicht entdeckt einer von euch den Fehler wäre echt super da ich nicht mehr weiter weiß.....


 


Gruß


TheWebWasher

bei Antwort benachrichtigen
Wumpchild TheWebWasher „Probleme im Programmieren in Assembler“
Optionen

bringt dich das weiter?
hab ich gerade gefunden


Asm-Intel

; Hello World for Intel Assembler (MSDOS)

mov ax,cs
mov ds,ax
mov ah,9
mov dx, offset Hello
int 21h
xor ax,ax
int 21h

Hello:
db "Hello World!",13,10,"$"

p r o s tWumpchild
bei Antwort benachrichtigen
TheWebWasher Wumpchild „bringt dich das weiter? hab ich gerade gefunden Asm-Intel Hello World for Intel...“
Optionen

Muß mal gucken...
Schon mal danke im vorraus....

bei Antwort benachrichtigen
mr.escape TheWebWasher „Probleme im Programmieren in Assembler“
Optionen

Also es scheint der offset text_5 nicht richtig in si anzukommen (sondern ein byte davor, d.h. das ende von text_1 (das null byte am ende))
mov si,offset text_1
l1:
mov dl,[si]
cmp dl,0
jz l2a //hier (l2a statt l2)
mov ah,2
int 21h
inc si
jmp l1

l2a: mov si,offset text_5 //und hier (l2a)
l2: mov ah,1
int 21h
cmp al,0dh
jz l3
mov [si],al
inc si
jmp l2

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
TheWebWasher mr.escape „Also es scheint der offset text_5 nicht richtig in si anzukommen sondern ein...“
Optionen

Hi mr.escape,

vielen vielen dank für deine hilfe du hast mir echt geholfen. Kannst du mir vielleicht auch sagen warum der den Offset von Text_5 nicht gemacht hat oder war das reiner zufall..... das das mit der l2a Sprungmarke funktioniert..

Gruß TheWebWasher

bei Antwort benachrichtigen
mr.escape TheWebWasher „Hi mr.escape, vielen vielen dank für deine hilfe du hast mir echt geholfen....“
Optionen
Kannst du mir vielleicht auch sagen warum der den Offset von Text_5 nicht gemacht hat oder war das reiner zufall..... das das mit der l2a Sprungmarke funktioniert..
Nee nee, das war tatsächlich nur reiner zufall!


;)




Jetzt mal ernsthaft.
Der sprung "jmp l1" ist ein unbedingter sprung und wird immer ausgeführt. Jeder code dahinter muss bewusst angesprungen werden.
Innerhalb der durch "jmp l1" gebildeten schleife kommt nur "jz l2" raus (aber diesmal bedingt). Dieser sprung wird genommen, wenn der zeiger "si" auf das abschliessende null byte zeigt. Da durch "jz l2" der befehl "mov si,offset text_5" übersprungen wird, bleibt "si" genau ein byte vor "text_5" stehen. Wird nun die eingabe gemacht, landet sie im speicher ab "text_5-1", d.h. das erste byte liegt vor "text_5". Wird dann später der speicher ab "text_5" ausgegeben, fehlt logischer weise das erste byte. Etwas weiter unten wurde ja mit "l5" und "l6" ja das gleiche problem vermieden.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen