#!/bin/bash
name="Vajda"
firstname="David"
if [[ "$name" == "$2" && "$firstname" == "$1" ]]
then
echo "Das bin ich"
elif [[ "$name" == "$1" && -z "$2" ]]
then
echo "Das koennte ich sein"
else
echo "hallo welt"
i=0
while [ $i -lt 10 ]
do
echo "Hallo zum $(($i+1))."
i=$(($i+1))
done
M=(a b c d)
M+=(e f g h)
i=0
while [ $i -lt 8 ]
do
echo "${M[$i]}"
i=$(($i+1))
done
i=0
for s in "${M[@]}"
do
echo "$s"
done
l=$(ls)
for s in $l
do
if [ $i -eq 8 ]
then
break
fi
echo $s
i=$(($i+1))
done
/bin/bash "$0" "David" "Vajda"
/bin/bash "$0" "Vajda"
fi
Der Assembler Quelltext
;; ich weiss jetzt wie es richtig geht. Es ist mir erstens an entsprechender Stelle aufgefallen
;; wenn man hier den String anguckt, er ist verkehrt herum
david@work:~$ /bin/bash assemble.sh mmxsort20240919d
Aber Hallo Welt sagt David Vajda Vajda David sagt Welt Hallo Aber david@work:~$
Wie kommt das? Ganz einfach. So wie ich mir dachte laedt MOVQ von der Addresse. Weil ich lade ja das Datum in der Variable
Hier vergleicht er die Addresse von EDI und ESI macht desswgen verkehrt
Gut, packed und unpacked hat nichts mit bitfeld und float zu tun. sprich Saturation oder nicht Wir hatten das in der Pruefung. Waehrend ich genau eine IEEE754 floating Point zahl selber binaer darstellen kann, hier hat es etwas gehapert .Aber Packed gibt es auch bei BCD. Ich mache wieder die Aufgaben zu IEEE lohnt sich und das hier auch. Aber - das hat damit nichts zu tun
Allerdins stoerte das B am Ende des Befehl
Es steht fue Byte
Der Befehl P CMP P GT D
pcmpgtd
oder
pcmpgtdb
Byte st
steht am Ende, p und cmp und gt - greater. ich brauche aber ganze zahlen
global _start
section .data
str: db "Aber ", "Hallo ", "Welt ", "sagt ", "David ", "Vajda "
section .text
_start:
mov ecx, str
call printstart
mov edi, str
sortloop1: mov eax, edi
cmp eax, str + 8*7
jge sortloop1end
mov esi, edi
sortloop2: add esi, 8
mov eax, esi
cmp eax, str + 8*7
jge sortloop2end
movq mm0, [esi]
movq mm1, [edi]
pcmpgtd mm0, mm1
jge noexchange
movq mm0, [esi]
movq mm1, [edi]
movq [esi], mm1
movq [edi], mm0
noexchange:
jmp sortloop2
sortloop2end:
add edi, 8
jmp sortloop1
sortloop1end:
mov ecx, str
call printstart
mov ebx, 0
mov eax, 1
int 80h
printstart:
cmp ecx, str + 7*8
jge printend
mov edx, 8
mov ebx, 1
mov eax, 4
int 0x80
add ecx, 8
jmp printstart
printend: ret
wir fangen an, ieee-754 um zu rechnen
#include <stdio.h>
int main (void) {
int x = 1234;
int sh = 0;
int b = 0;
while (x != 0) {
if ((x % 2) == 1)
b = b | (1 << sh);
x = x/2;
sh ++;
}
printf ("%i\n", b);
return 0;
}
Und weiter
#include <stdio.h>
#include <string.h>
int main (void) {
int x = 1234;
int sh = 0;
unsigned int b = 0;
while (x != 0) {
if ((x % 2) == 1)
b = b | (1 << sh);
x = x/2;
sh ++;
}
printf ("%u\n", b);
char *str = "1234";
char *p;
int base;
printf ("sizeof float: %i\n", sizeof (float));
for (p = str + strlen (str) -1, b = 0, base = 1; p >= str; p--, base = base * 10) {
b = b + ((*p) - '0') * base;
}
printf ("%u\n", b);
return 0;
}
Und weiter
#include <stdio.h>
#include <string.h>
int main (void) {
int x = 1234;
int sh = 0;
unsigned int b = 0;
while (x != 0) {
if ((x % 2) == 1)
b = b | (1 << sh);
x = x/2;
sh ++;
}
printf ("%u\n", b);
char *str = "1234";
char *p;
int base;
printf ("sizeof float: %i\n", sizeof (float));
for (p = str + strlen (str) -1, b = 0, base = 1; p >= str; p--, base = base * 10) {
b = b + ((*p) - '0') * base;
}
printf ("%u\n", b);
char *fstr = "1234.1234";
char *s1;
char *s2;
unsigned m1, m2;
int base1, base2;
for (s1 = fstr; (*s1 != 0) && (*s1 != '.'); s1++);
if (*s1 == '.') {
for (p = s1 -1, m1 = 0, base1 = 1; p >= fstr; p--, base1 = base1 * 10) {
m1 = m1 + ((*p) - '0') * base1;
}
for (p = (fstr + strlen (fstr) - 1), base2 = 1, m2 = 0; p >= (s1+1); p--, base2 = base2 * 10)
m2 = m2 + ((*p) - '0') * base2;
printf ("%u.%u\n", m1, m2);
printf ("%i %i\n", base1, base2);
}
return 0;
}
/*
Ich denke, das sollte uns gelingen, geschriebene rationale Zahl im
entsprechenden Zahlenbereich in eine IEEE754 Flie"s, Zahl umzurechnen was
wir nat"urlich bedenken m"ussen ist am, dass wir es mit zweier Potenzen zu
tun haben. D.h. im ersten Schritt in mein Programm werden wir noch mal
brauchen Bei dem hinter dem Roma m"ussen wir nicht viel tun, au"ser dass wir
das ganze mit zwei multiplizieren soll hei"sen um eins nach links schifften
und dabei m"ussen wir eine Grenzzahl festlegen, weil wir sind ja hinter dem
Komma d.h. wir m"ussten hier eigentlich eins nehmen da wir hier aber die
komplette Darstellung sozusagen wiederum einer ganzen Zahl haben. Hinter
dem Komma m"ussen wir einen Wert nehmen, dessen Basis genau eins dr"uber ist
und jedes Mal, wenn es "uberschritten wird, dann ziehen wir diese Basis ab
und schifften es weiter und dann merken wir uns eine eins das ist nicht
besonders kompliziert ebenso wenig kompliziert ist die erste eins vorne
abzuschneiden von dem Teil vor dem Komma vor der Mantisse. Wir m"ussen aber
hier im bin"aren Bereich denken und dementsprechend ist es nicht besonders
schwierig den Bias also die Verschiebung auszurechnen des +127 zu addieren
und dann haben wir eigentlich unsere Floating Point Zahl selber errechnet
ja gut. Viel mehr m"ussen wir nicht tun, denn die Umrechnung des Floating
Points unternimmt zun"achst einmal heutzutage zumindest die f"ur. Anders ist
es in Zeiten des sechs 8086 da haben wir vielleicht ein Coprozessor
installiert, oder wir m"ussen das selber umsetzen. Ich selber habe
Mainboards, da muss man die F PU per Hand einsetzen.
*/