Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- void monitor(char*);
- char* asm_strcpy(char*, const char*);
- char* asm_strcat(char*, const char*);
- char* str_cpy(char*, const char*);
- char* str_cat(char*, const char*);
- char sz1[99] = "SONY ",
- sz2[99] = "Pictures",
- *psz = 0 ;
- /////////////////////////////////////////////////////////
- int main(int nParam, char **ppsz) //
- {
- if(nParam == 2)
- {
- printf("From the command line, you passed the word: %s\n", ppsz[1] );
- asm_strcpy(sz2, ppsz[1] );
- }
- // psz = asm_strcpy(sz1, sz2);
- psz = asm_strcat(sz1, sz2);
- sz2[0] = 48 ;
- sz2[1] = '0';
- sz2[2] = 0 ;
- printf("sz1 = %s \n", sz1);
- printf("sz2 = %s \n", sz2);
- printf("psz = %s \n", psz);
- monitor(sz1);
- scanf("%s", sz1);
- return 0;
- }
- #ifdef _MSC_VER
- /////////////////////////////////////////////////////////
- char* asm_strcpy(char *psz1, const char *psz2) //
- {
- __asm // - - - - - - - - - - - - -
- { mov esi , psz2 // Передача адресов строк в индексные регистры: esi
- mov edi , psz1 // (Source Index) и edi (Extended Destination Index)
- L_01: mov al , [esi]
- mov [edi], al
- or al , 0
- jz L_02
- inc esi
- inc edi
- jmp L_01
- L_02: mov eax , psz1 // Передача, через аккумулятор (eax) возвращаемого параметра.
- }; // - - - - - - - - - - - - -
- }
- /////////////////////////////////////////////////////////
- char* asm_strcat(char *psz1, const char *psz2) //
- {
- __asm { mov edi , psz1 // Хотим посчитать кол-во символов в psz1
- dec edi // и сместить edi в конец Си-строки
- L_00: inc edi
- or [edi] , 0 // Логическое ИЛИ влияет на флаг нуля
- jnz L_00
- mov esi , psz2 // Теперь приступим к переносу psz2 в psz1
- L_01: mov al , [esi]
- mov [edi], al
- or al , 0
- jz L_02
- inc esi
- inc edi
- jmp L_01
- L_02: mov eax , psz1 }; // Передача, через аккумулятор (eax) возвращаемого параметра.
- }
- #endif
- #ifdef __GNUC__
- ///////////////////////////////////////////////////////// -masm=intel
- char* asm_strcpy(char *psz1, const char *psz2) //
- {
- __asm(" mov esi , %1 ;"
- " mov edi , %0 ;"
- " L_01: mov al , [esi] ;"
- " mov [edi], al ;"
- " or al , 0 ;"
- " jz L_02 \n\t" // Так тоже можно завершить строку.
- " inc esi ;"
- " inc edi ;"
- " jmp L_01 ;"
- " L_02: ;"
- // - - - - - - - - - - - - - - - -
- // "m" = memory
- :: "m"(psz1), "m"(psz2)
- : "%eax", "%esi", "%edi" // Регистры, которые нужно восстановить после использования.
- );
- return psz1;
- }
- ///////////////////////////////////////////////////////// -masm=intel
- char* asm_strcat(char *psz1, const char *psz2) //
- {
- __asm(" mov edi , %0 ;"
- " dec edi ;"
- " L_03: inc edi ;"
- " mov al , [edi] ;"
- " or al , 0 ;"
- " jnz L_03 ;"
- " mov esi , %1 ;"
- " L_04: mov al , [esi] ;"
- " mov [edi], al ;"
- " or al , 0 ;"
- " jz L_05 ;" // Так тоже можно завершить строку.
- " inc esi ;"
- " inc edi ;"
- " jmp L_04 ;"
- " L_05: ;"
- // - - - - - - - - - - - - - - - -
- :: "m"(psz1), "m"(psz2)
- : "%eax", "%esi", "%edi" // Регистры, которые нужно восстановить после использования.
- );
- return psz1;
- }
- #endif
- /////////////////////////////////////////////////////////
- char* str_cpy(char *psz1, const char *psz2) //
- {
- int i = 0;
- while(psz2[i] != 0) psz1[i] = psz2[i++];
- psz1[i] = 0;
- return psz1;
- }
- /////////////////////////////////////////////////////////
- char* str_cat(char *psz1, const char *psz2) //
- {
- int i = 0,
- k = 0;
- while(psz1[++k]);
- while(psz2[i] != 0) psz1[i+k] = psz2[i++];
- psz1[i+k] = 0;
- return psz1;
- }
- /////////////////////////////////////////////////////////
- void monitor(char *psz) //
- {
- int i = 0; printf("\n We print from the \"monitor\" function:\n");
- printf("Codes of all characters in the psz string:\n");
- while(psz[i]) { printf("psz[%2d] = %c = %3d\n", i, psz[i], psz[i]); i++; }
- printf("psz[%2d] = %c = %3d\n", i, psz[i], psz[i]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement