X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=asma%2Fasma.s;fp=asma%2Fasma.s;h=b7da2c710c3b4718792be329263b9d5753f53b23;hb=c52c053a891d0b087ac11fdefbeef17f774a4a34;hp=e1538b4d1c002361010a30b042100874c9dc8ceb;hpb=0112907aab8fcb547ca0637d8141a226fa2735e6;p=uebersetzerbau-ss10.git diff --git a/asma/asma.s b/asma/asma.s index e1538b4..b7da2c7 100644 --- a/asma/asma.s +++ b/asma/asma.s @@ -4,16 +4,35 @@ .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