Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Phier am 13. May 2004, 14:57

Titel: Allgemeine Arithmetik
Beitrag von: Phier 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
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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
Titel: Allgemeine Arithmetik
Beitrag von: Phier 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
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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!!!
Titel: Allgemeine Arithmetik
Beitrag von: Phier 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
Titel: Allgemeine Arithmetik
Beitrag von: chr15 am 13. May 2004, 15:58
Also du möchtest zum Beispeil ein 'd' eingeben und ein 'h' erhalten??? Liege ich da richtig?
Titel: Allgemeine Arithmetik
Beitrag von: Phier 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
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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)
Titel: Allgemeine Arithmetik
Beitrag von: Phier am 13. May 2004, 16:45
wie kann ich dann nen taschenrechner in assembler machen ? ;( würd das gerne nämlich
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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???
Titel: Allgemeine Arithmetik
Beitrag von: Phier 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 ...
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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???
Titel: Allgemeine Arithmetik
Beitrag von: Phier 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
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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)
Titel: Allgemeine Arithmetik
Beitrag von: Phier am 14. May 2004, 17:48
das wäre echt super von dir !!!
;-) würd mich auch revangieren ... ;D
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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 ???
Titel: Allgemeine Arithmetik
Beitrag von: Roshl 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*
Titel: Allgemeine Arithmetik
Beitrag von: Phier 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
Titel: Allgemeine Arithmetik
Beitrag von: lobmann 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
Titel: Allgemeine Arithmetik
Beitrag von: chr15 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.
Titel: Allgemeine Arithmetik
Beitrag von: Roshl am 16. May 2004, 18:43
Zahlen in strings addiern? Wozu sollte man sowas machn wolln? Naja und wenn wandelt man den String vorher in ne verwendbare Zahl um ist ja nicht sonderlich schwer (find ich)
Titel: Allgemeine Arithmetik
Beitrag von: chr15 am 16. May 2004, 18:58
Was macht denn meine Funktion???  Sie wandelt einen String in eine Zahl um!
Titel: Allgemeine Arithmetik
Beitrag von: Phier am 16. May 2004, 21:28
lol also erstmal danke jungs ich schau mir den code von chr15 gleich mal an
thxle

mfg
phier
Titel: Allgemeine Arithmetik
Beitrag von: joachim_neu am 17. May 2004, 13:39
das problem ist denke ich, dass du immer den ASCII-Code nimmst und der ist bei "0" 48... Also nimmste am besten den ScanCode, der ist bei "1" 2 also musst du ihn um eins dezimieren. Dann hast du bei "1" den Wert 1. Bei "0" hast du aber den Wert 10 also musst du das überprüfen und wenn die Zahl "0" eingegeben wurde den Wert aus 0 bringen... Zu all dem hab ich schonmal eine Funktion geschrieben, die aber mit BIOS-Ints arbeitet... Ich habesie an TeeJay geschickt... Wird warscheinlich bald im Ressourcen-Center auftauchen... Du musst also nur die BIOS-Ints gegen int 0x21 eintauschen usw. Dann kannste die Funktion benutzen. Sieht dann etwa so aus:

call get_number
mov bx,cx
call get_number
add cx,bx

get_number:
blblblbl
ret


dann nimmste die Funktion von chr15 und wandelst CX in einen String um. Den gibste dann aus.

Ich hoffe ich habe dir geholfen und dich nicht verwirrt...

mfg

JOACHIM NEU
Titel: Allgemeine Arithmetik
Beitrag von: lobmann am 17. May 2004, 16:46
Ich würd das schon mit ascii zeichen machen dann kannst du die Funktion auch beim simplen ausgeben von strings verwenden scancodes funktionieren ja nur bei tastatur eingabe
Titel: Allgemeine Arithmetik
Beitrag von: joachim_neu am 17. May 2004, 19:37
dann musste von jedem zeichen 48 abziehen um den absoluten wert, also bei 0 mit ASCII 48 auch 0 zu erhalten....
Titel: Allgemeine Arithmetik
Beitrag von: chr15 am 17. May 2004, 19:40
Ja das ist doch kein Problem, oder??? Ist dich bei mr im Code doch auch schon drinne. Dat is eine Zaile, dat kan man ja uch noch verkraften, oder net?