8 /* unsigned char *asma(unsigned char *s)
11 for (i=0; i<16; i++) {
13 c += (c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;
19 Schreiben Sie diese Funktion in Assembler unter Verwendung von pcmpgtb. Dabei ist folgende Äquivalenz hilfreich:
20 (c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;
22 ist (bei Verwendung von Überlauf-Arithmetik) äquivalent zu
23 min(’Z’+1+min_t-’A’ > c+min_t-’A’ ? 0xff : 0, ’a’-’A’)
25 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. */
29 #init %xmm2 mit "'Z' + 1" fuer jedes byte
30 mov $0x5a5a5a5a5a5a5a5a, %rbx
35 #init %xmm4 mit "'a'-'A'= 97-65 = 32 = 0x20
36 mov $0x2020202020202020, %rbx
41 #speicheradresse des pointers zeigt auf 16*8 feld = 128bit
45 #"Packed COMpare Greater Than (Byte)"
56 .section .eh_frame,"a",@progbits
76 .long .LEFDE1-.LASFDE1
78 .long .LASFDE1-.Lframe1
84 .ident "GCC: (Debian 4.3.2-1.1) 4.3.2"
85 .section .note.GNU-stack,"",@progbits