Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // labnup4.cpp: определяет точку входа для консольного приложения.
- //
- //pasrev - аналог strrev для pascal-строк
- #include "string.h"
- #include "stdafx.h"
- #if defined(__GNUC__)
- char *x_pasrev(char *str) {
- unsigned char len = str[0];
- if (len < 2) return str;
- unsigned char *beg = str + 1, *end = str + len, i;
- for (i = 0; i < len / 2; i++) {
- asm("movb (%0), %%al\n\t"
- "movsb\n\t"
- "movb %%al, -1(%1)\n\t"
- "sub $2, %0\n\t" : "+D"(end), "+S"(beg) : : "al");
- }
- return str;
- }
- #else
- char *x_pasrev(char *str) {
- unsigned char len = str[0];
- if (len < 2) return str;
- unsigned char *beg = str + 1, *end = str + len, i;
- for (i = 0; i < len / 2; i++) {
- __asm {
- mov esi, beg
- mov edi, end
- mov al, [edi]
- movsb
- mov [esi - 1], al
- sub edi, 2
- mov beg, esi
- mov end, edi
- }
- }
- return str;
- }
- #endif
- int main()
- {
- int i;
- char pastr1[9] = { 8, 'D', 'E', 'S', 'S', 'E', 'R', 'T', 'S'};
- printf("in :%d ", pastr1[0]);
- for (i = 1; i < pastr1[0] + 1; i++) printf("%c", pastr1[i]);
- char *pastr2 = x_pasrev(pastr1);
- printf("\nout:%d ", pastr2[0]);
- for (i = 1; i < pastr2[0] + 1; i++) printf("%c", pastr2[i]);
- char pastr3[5] = { 4, 'E', 'V', 'I', 'L' };
- printf("\nin :%d ", pastr3[0]);
- for (i = 1; i < pastr3[0] + 1; i++) printf("%c", pastr3[i]);
- char *pastr4 = x_pasrev(pastr3);
- printf("\nout:%d ", pastr4[0]);
- for (i = 1; i < pastr4[0] + 1; i++) printf("%c", pastr4[i]);
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement