Autor Thema: Allgemeine Arithmetik  (Gelesen 15618 mal)

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« am: 13. May 2004, 14:57 »
Hi,

Wenn ich mit mov ah,1 bei int 21h arbeite wird das eingegebene Zeichen unter al gespeichert   nehmen wir an ich will ne kleine addition machen, d.h. erstmal mit einem festen wert addieren. z.b. x+3   müsste doch so sein
mov ah,1
add al,3
blos wie kann ich nun rausfinden wo die summe steht in welche register die also is ?
möchte das dann aufn bildschirm ausgeben lassen, später dann zwei frei wählbare zahlen mit einander addieren blos da weiss ich nicht wie ich die in ein übergreifendes register schreiben kann ohne dass mir nasm nen fehler bringt
weil z.b.
mov dx,al < bringt er immer fehler

MfG
Phier

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #1 am: 13. May 2004, 15:03 »
Also das Ergebnis einer Addition/Subtraktion wir immer in das zuerst verwendete Register geschrieben:
add ax, 6 -> Ergebnis in ax
add bx, cx -> Ergebnis in bx
Bei einem Übertrag wird das Carry-Flag gesetzt

mov dx, al kann nicht funktionieren, da dx 16 und al 8 Bytes groß ist! Du musst dass dann so machen:
xor dh, dh ; löscht de Inhalt von dh
mov dl, al ; kopiert den Wert

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 13. May 2004, 15:16 »
Hmm was daran falsch:
org 100h
mov dx,add_a
mov ah,9
int 21h
mov ah,7
add al,4
int 21h
xor dh,dh
mov dl,al
mov ah,9
int 21h
mov ah,4Ch
int 21h

add_a db 0Dh,0Ah,'Bitte zuaddierenden Wert eingeben:',0Dh,0Ah,'$'
Bringt mir immer nen Fehler bei ausführen nicht beim compilen ;D

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #3 am: 13. May 2004, 15:25 »
org 100h
mov dx,add_a
mov ah,9
int 21h
dürfte den String ausgeben.
mov ah,7
add al,4 ; unnötig, wird durch Interrupt überschrieben
int 21h
xor dh,dh
mov dl,al
Das zeichen in dx (dl).

Hier fängt der Unsinn an:
mov ah,9
int 21h
Was soll das ausgeben??? Dx hat doch keine Adresse auf einen String, sondern enthält ein zeichen!!!

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 13. May 2004, 15:34 »
naja ich will ja dass er mir das ergebnis der addition aufn bildschirm präsentiert irgendwie, aber is wohl falscher weg

hmm

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #5 am: 13. May 2004, 15:58 »
Also du möchtest zum Beispeil ein 'd' eingeben und ein 'h' erhalten??? Liege ich da richtig?

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. May 2004, 16:00 »
halber ich möcht eine zahl eingeben z.b. 1 diese mit +3 addieren und dann 4 erhalten


später dann die +3 mit ner variable ersetzen die ich aussuchen kann also nen ganz einfache rechner coden fürn anfang

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #7 am: 13. May 2004, 16:10 »
Da setzt du ganz falsch an. Die Dosfunktionen unterstützen nur Zeicehn und zeichenketten und keine Zahlen. Wenn du damit richtig rechnen möchtest musst du die Strings erst in zahlen umwandeln, dann rechnen und dann die Zahlen wieder in Strings umwandeln (würde jetzt Seiten füllen)

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 13. May 2004, 16:45 »
wie kann ich dann nen taschenrechner in assembler machen ? ;( würd das gerne nämlich

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #9 am: 13. May 2004, 17:41 »
Also dir jetzt die ganze Assemblersprache und die Arbeitsweise eines Rechners beizubringen würde jetzt zu viele Seiten in Anspruch nehmen. Frag doch mal TeeJay, wann das Asm-Tut fertig ist. Da wird das meiste wichtige erkläart.
Also TeeJay???

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. May 2004, 20:51 »
geht ja eigentlich nur um addition ... ist das wirklich so schwierig ich mein in c++ isses einfach variable1 + variable2 kann mir net vorstellen dass es hier in 20 zeilen code is ...

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #11 am: 13. May 2004, 21:41 »
Die Addition sind max. 5 zeilen, aber es geht hier auch um die Umwandlung von Strings in Zahlen und Zahlen in Strings. Du kannst keine Strings addieren und hoffen, das das im dekadischen System auch richtig ist (wobei jedes byte eine ziffer sein sollte).
In C kannst du doch auch nicht sagen
char  *a="12", char *b="26", char c[10];
c = a + b;

Was soll das sein???? C ist garantiert nicht "38" !!!!
Jetzt das Problem begriffen???

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 13. May 2004, 21:52 »
ja hab ich, aber ist es wirklich so ein großes problem das zu machen ? habt ihr vielleicht außer von teejay grad nen tut irgendwie im net wo mit nasm erklärt wird wie man nen taschenrechner mit einfachen funktionen codet oder einfach addition substitution usw ?

MfG
Phier

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #13 am: 13. May 2004, 21:56 »
Also ich könnte dir n kleinen text über Zahlensysteme gebn, könnte dir helfen die Strings in Zaheln umzuwandeln, oder wenn du nochn bisschen Zeit hast, kann ich dir auch so ne Funktion schreiben, nur im Moment hab ich keine zeit (morgen vielleicht)

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 14. May 2004, 17:48 »
das wäre echt super von dir !!!
;-) würd mich auch revangieren ... ;D

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #15 am: 15. May 2004, 19:11 »
Dieser Code wandelt eine Zeichenkette (Pointer darauf ist ein 32 Bit Parameter), in eine Zahl (eax) um. Es wird nicht geprüft, ob die Zeichenkette im richtigen Format vorliegt und es muss ein Nullterminierter String sein. Die Funktion ist für den 32Bit PMode:

global assembler_str2int

section .data

tmp dd 0x12345678


section .text

assembler_str2int:
push ebp
mov ebp, esp
push eax
push ebx
push ecx
push edx
push esi
mov eax, [ebp+8]
mov esi, eax
xor eax, eax
start_lp1:
push eax
lodsb
cmp al, 0
je ende
sub al, 48
xor ebx, ebx
mov bl, al
pop eax
mov edx, 10
mul edx
add eax, ebx
jmp start_lp1
ende:
pop eax
mov [tmp], eax
pop esi
pop edx
pop ecx
pop ebx
pop eax
mov eax, [tmp]
pop ebp
retn
hift's ???

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #16 am: 16. May 2004, 11:25 »
Naja zum thema schwierigkeit von addition. Also ne ganz simple anweisung aus C mal für ASM.
C:
   Ergebnis=Var1+Var2;
asm:
   mov eax,[var1]
   mov ebx,[var2]
   add eax,ebx
   mov Ergebnis,eax

so in etwa;) Kompiler ham schon nich leicht;) die ham viel zu tun bei soner umwandlung. Parsen,Syntax checken,in nen Tokenstrom umwandeln, den optimiern, zu asm machn;) ums mal ganz primitiv auszudrücken*g*
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 16. May 2004, 12:12 »
hmm der code von chr15 sieht ja sehr komplex aus für das was er letztendes macht, dagegen hält sich der von Roshl ja noch im rahmen, wenn beide codes doch eigentlich das gleiche tun wieso ist der eine solange und der andere so kurz ? ( überprüft der andere viel ? muss mich mir also immer wenn ich in meinen programm ne addition einbauen will den code von chr15 merken ? )

MfG
Phier

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #18 am: 16. May 2004, 12:30 »
Der Code von chr15 addiert Zahlen die sich in einem String befinden und der von Roshl is nur ne simple addition von zwei werten
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #19 am: 16. May 2004, 12:48 »
@Roshl: Wenn du den Thread verfolgt hättest, würdes du sehen, das es hier um die Sachen geht, die von der Dos Funktion zurückgeliefert werden, und das sind halt Strings.
@Phier: Wenn du 2 String-Zahlen addieren möhtest muss du beides verwenden und dann brauchst du noch eine Umwandlung von Zahl in String, wenn du Das wieder mit der Dos Funktion ausgeben möchtest.
Wenn du Dos-Strings nimmst muss du bei mir die Zeile
cmp al, 0
in
cmp al, '$'
umändern.

 

Einloggen