asma: daten werden nun in xmm1 geschoben und auch wieder (richtig) ins return registe...
[uebersetzerbau-ss10.git] / asma / asma.s
index e1538b4d1c002361010a30b042100874c9dc8ceb..b7da2c710c3b4718792be329263b9d5753f53b23 100644 (file)
@@ -4,16 +4,35 @@
        .type   asma, @function
 asma:
 .LFB2:
-       #movdqu $0xffffffffffffffff, %xmm1
+
+/* unsigned char *asma(unsigned char *s)  
+{  
+  int i;  
+  for (i=0; i<16; i++) {  
+    unsigned char c=s[i];  
+    c += (c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;  
+    s[i] = c;  
+  }  
+  return s;  
+}
+
+Schreiben Sie diese Funktion in Assembler unter Verwendung von pcmpgtb. Dabei ist folgende Äquivalenz hilfreich:
+(c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;
+
+ist (bei Verwendung von Überlauf-Arithmetik) äquivalent zu
+min(’Z’+1+min_t-’A’ > c+min_t-’A’ ? 0xff : 0, ’a’-’A’)
+
+wobei min_t der minimale Wert des Datentyps ist, den der Vergleich behandelt (bei pcmpgtb also -128). Zusätzlich zu dem oben genannten dürften die Befehle pminub, paddb, und psubb nützlich sein. */
+       #clear %xmm1
        pxor %xmm1, %xmm1
 
        #speicheradresse des pointers zeigt auf 16*8 feld = 128bit
-       movdqa (%rdi), %xmm2
+       movdqa (%rdi), %xmm1
 
+       #todo
        #pcmpgtb %xmm1, %xmm2
 
-       #movdqa %xmm2, (%rdi)
-       movq    %rdi, %rax
+       movq %xmm1, (%rax)
        ret
 .LFE2:
        .size   asma, .-asma