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. */
32 #init %xmm2 mit "'Z' + 1 + min_t - 'A'" fuer jedes byte
33 #'Z' + 1 + min_t - 'A' = 90 + 1 - 128 - 65 = -102
36 #(~102)+1 = 10011010 = 0x9A
37 mov $0x9a9a9a9a9a9a9a9a, %rbx
42 #init %xmm4 mit "'a'-'A'= 97-65 = 32 = 0x20
43 mov $0x2020202020202020, %rbx
48 #speicheradresse des pointers zeigt auf 16*8 feld = 128bit
52 #addiere in %xmm1 "min_t-'A'"
53 # = -128 - 65 = 63 = 0x3f
54 mov $0x3f3f3f3f3f3f3f3f, %rbx
61 #"Packed COMpare Greater Than (Byte)"
72 .section .eh_frame,"a",@progbits
92 .long .LEFDE1-.LASFDE1
94 .long .LASFDE1-.Lframe1
100 .ident "GCC: (Debian 4.3.2-1.1) 4.3.2"
101 .section .note.GNU-stack,"",@progbits