asma: daten werden nun in xmm1 geschoben und auch wieder (richtig) ins return registe...
[uebersetzerbau-ss10.git] / asma / asma.s
1         .file   "asma.c"
2         .text
3 .globl asma
4         .type   asma, @function
5 asma:
6 .LFB2:
7
8 /* unsigned char *asma(unsigned char *s)  
9 {  
10   int i;  
11   for (i=0; i<16; i++) {  
12     unsigned char c=s[i];  
13     c += (c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;  
14     s[i] = c;  
15   }  
16   return s;  
17 }
18
19 Schreiben Sie diese Funktion in Assembler unter Verwendung von pcmpgtb. Dabei ist folgende Äquivalenz hilfreich:
20 (c>=’A’ && c<=’Z’) ? ’a’-’A’ : 0;
21
22 ist (bei Verwendung von Überlauf-Arithmetik) äquivalent zu
23 min(’Z’+1+min_t-’A’ > c+min_t-’A’ ? 0xff : 0, ’a’-’A’)
24
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. */
26         #clear %xmm1
27         pxor %xmm1, %xmm1
28
29         #speicheradresse des pointers zeigt auf 16*8 feld = 128bit
30         movdqa (%rdi), %xmm1
31
32         #todo
33         #pcmpgtb %xmm1, %xmm2
34
35         movq %xmm1, (%rax)
36         ret
37 .LFE2:
38         .size   asma, .-asma
39         .section        .eh_frame,"a",@progbits
40 .Lframe1:
41         .long   .LECIE1-.LSCIE1
42 .LSCIE1:
43         .long   0x0
44         .byte   0x1
45         .string "zR"
46         .uleb128 0x1
47         .sleb128 -8
48         .byte   0x10
49         .uleb128 0x1
50         .byte   0x3
51         .byte   0xc
52         .uleb128 0x7
53         .uleb128 0x8
54         .byte   0x90
55         .uleb128 0x1
56         .align 8
57 .LECIE1:
58 .LSFDE1:
59         .long   .LEFDE1-.LASFDE1
60 .LASFDE1:
61         .long   .LASFDE1-.Lframe1
62         .long   .LFB2
63         .long   .LFE2-.LFB2
64         .uleb128 0x0
65         .align 8
66 .LEFDE1:
67         .ident  "GCC: (Debian 4.3.2-1.1) 4.3.2"
68         .section        .note.GNU-stack,"",@progbits