.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