.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
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 {