Advertisement
Ladies_Man

#NUP lab4 (x_pasrev)

Jan 10th, 2015
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.52 KB | None | 0 0
  1. // labnup4.cpp: определяет точку входа для консольного приложения.
  2. //
  3. //pasrev - аналог strrev для pascal-строк
  4. #include "string.h"
  5. #include "stdafx.h"
  6.  
  7. #if defined(__GNUC__)
  8. char *x_pasrev(char *str) {
  9.     unsigned char len = str[0];
  10.     if (len < 2) return str;
  11.     unsigned char *beg = str + 1, *end = str + len, i;
  12.     for (i = 0; i < len / 2; i++) {
  13.         asm("movb (%0), %%al\n\t"
  14.             "movsb\n\t"
  15.             "movb %%al, -1(%1)\n\t"
  16.             "sub $2, %0\n\t" : "+D"(end), "+S"(beg) : : "al");
  17.     }
  18.     return str;
  19. }
  20. #else
  21. char *x_pasrev(char *str) {
  22.     unsigned char len = str[0];
  23.     if (len < 2) return str;
  24.     unsigned char *beg = str + 1, *end = str + len, i;
  25.     for (i = 0; i < len / 2; i++) {
  26.         __asm {
  27.             mov esi, beg
  28.             mov edi, end
  29.  
  30.             mov al, [edi]
  31.             movsb
  32.             mov [esi - 1], al
  33.             sub edi, 2
  34.  
  35.             mov beg, esi
  36.             mov end, edi
  37.         }
  38.     }
  39.     return str;
  40. }
  41. #endif
  42.  
  43. int main()
  44. {
  45.     int i;
  46.     char pastr1[9] = { 8, 'D', 'E', 'S', 'S', 'E', 'R', 'T', 'S'};
  47.     printf("in :%d ", pastr1[0]);
  48.     for (i = 1; i < pastr1[0] + 1; i++) printf("%c", pastr1[i]);
  49.     char *pastr2 = x_pasrev(pastr1);
  50.     printf("\nout:%d ", pastr2[0]);
  51.     for (i = 1; i < pastr2[0] + 1; i++) printf("%c", pastr2[i]);
  52.  
  53.  
  54.     char pastr3[5] = { 4, 'E', 'V', 'I', 'L' };
  55.     printf("\nin :%d ", pastr3[0]);
  56.     for (i = 1; i < pastr3[0] + 1; i++) printf("%c", pastr3[i]);
  57.     char *pastr4 = x_pasrev(pastr3);
  58.     printf("\nout:%d ", pastr4[0]);
  59.     for (i = 1; i < pastr4[0] + 1; i++) printf("%c", pastr4[i]);
  60.  
  61.     getchar();
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement