asma: daten werden nun in xmm1 geschoben und auch wieder (richtig) ins return registe...
authorBernhard Urban <lewurm@gmail.com>
Sun, 28 Feb 2010 13:59:21 +0000 (14:59 +0100)
committerBernhard Urban <lewurm@gmail.com>
Sun, 28 Feb 2010 13:59:21 +0000 (14:59 +0100)
asma/asma.s
asma/main.c

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
index a0da9e63c8cacf67d958db1d8ed113a3dced96fb..fabeaab9a7d93e2966ffde76a6491b21ea496119 100644 (file)
@@ -26,12 +26,15 @@ int main(int argc, char **argv) {
        for(i = 0; i < 3; i++) {
                input2 = strdup(input1[i]);
                input3 = strdup(input1[i]);
-               output1 = (unsigned char*) asma_ref((unsigned char *)(input2));
-               output2 = (unsigned char*) asma((unsigned char *)(input3));
+               printf("input2: %p\n", input2);
+               output1 = (char *)asma_ref((unsigned char *)(input2));
+               output2 = (char *)asma((unsigned char *)(input3));
+
+               printf("asma-output2: %p\n", output2);
+               fflush(stdout);
 
                output1[16]='\0';
                output2[16]='\0';
-
                if(memcmp(output1,output2, 16)) {
                        printf("Testfall falsch; erwartet:\n\t\"%s\"\ntatsaechliches Ergebnis:\n\t\"%s\"\n", output1, output2);
                } else {