Advertisement
dllbridge

Untitled

Mar 22nd, 2024
724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.78 KB | None | 0 0
  1.  
  2.  
  3. #include    <stdio.h>
  4.  
  5.  
  6. void                  monitor(char*);
  7. char* asm_strcpy(char*, const char*);
  8. char* asm_strcat(char*, const char*);
  9. char*    str_cpy(char*, const char*);
  10. char*    str_cat(char*, const char*);
  11.  
  12.  
  13. char sz1[99] =    "SONY ",
  14.      sz2[99] = "Pictures",
  15.     *psz     =         0 ;  
  16.  
  17. /////////////////////////////////////////////////////////
  18. int main(int nParam, char **ppsz)                      //  
  19. {
  20.    
  21.     if(nParam == 2)
  22.     {
  23.        
  24.        printf("From the command line, you passed the word: %s\n", ppsz[1] );   
  25.        asm_strcpy(sz2, ppsz[1] );
  26.     }
  27.    
  28. //  psz    = asm_strcpy(sz1, sz2);
  29.     psz    = asm_strcat(sz1, sz2);    
  30.     sz2[0] =  48 ;
  31.     sz2[1] =  '0';
  32.     sz2[2] =   0 ;
  33.     printf("sz1 = %s \n", sz1);    
  34.     printf("sz2 = %s \n", sz2);
  35.     printf("psz = %s \n", psz);
  36.     monitor(sz1);
  37.     scanf("%s", sz1);
  38.    
  39. return 0;
  40. }
  41.  
  42.  
  43.  
  44. #ifdef   _MSC_VER
  45. /////////////////////////////////////////////////////////
  46. char* asm_strcpy(char *psz1, const char *psz2)         //
  47. {    
  48.      __asm  // - - - - - - - - - - - - -
  49.        {                 mov  esi , psz2               //  Передача адресов строк в индексные регистры: esi
  50.                          mov  edi , psz1               //  (Source Index) и edi (Extended Destination Index)
  51.                    
  52.             L_01:        mov   al , [esi]
  53.                          mov [edi],   al
  54.                          or    al ,    0
  55.                          jz   L_02
  56.                          inc  esi
  57.                          inc  edi
  58.                          jmp  L_01
  59.             L_02:        mov  eax , psz1               //  Передача, через аккумулятор (eax) возвращаемого параметра.
  60.        };   // - - - - - - - - - - - - -
  61. }
  62.  
  63. /////////////////////////////////////////////////////////  
  64. char* asm_strcat(char *psz1, const char *psz2)         //                
  65. {
  66.      
  67.           __asm {        mov  edi , psz1               //  Хотим посчитать кол-во символов в psz1
  68.                          dec  edi                      //  и сместить edi в конец Си-строки  
  69.             L_00:        inc  edi
  70.                          or  [edi] ,  0                //  Логическое ИЛИ влияет на флаг нуля
  71.                          jnz  L_00  
  72.                          mov  esi , psz2               //  Теперь приступим к переносу psz2 в psz1
  73.             L_01:        mov   al , [esi]
  74.                          mov [edi],   al
  75.                          or    al ,    0
  76.                          jz   L_02
  77.                          inc  esi
  78.                          inc  edi
  79.                          jmp  L_01
  80.             L_02:        mov  eax , psz1          };   //  Передача, через аккумулятор (eax) возвращаемого параметра.
  81.                
  82. }
  83. #endif
  84.  
  85.  
  86.  
  87. #ifdef   __GNUC__
  88. /////////////////////////////////////////////////////////  -masm=intel
  89. char* asm_strcpy(char *psz1, const char *psz2)         //                
  90. {
  91.    
  92.     __asm("           mov  esi ,   %1         ;"
  93.           "           mov  edi ,   %0         ;"
  94.           " L_01:     mov   al , [esi]        ;"       
  95.           "           mov [edi],   al         ;"
  96.           "           or    al ,    0         ;"
  97.           "           jz   L_02            \n\t"       //  Так тоже можно завершить строку.
  98.           "           inc  esi                ;"
  99.           "           inc  edi                ;"   
  100.           "           jmp  L_01               ;"
  101.           " L_02:                             ;"         
  102.           //    - - - - - - - - - - - - - - - -
  103.           // "m" = memory
  104.           :: "m"(psz1), "m"(psz2)
  105.            : "%eax", "%esi", "%edi"                    //  Регистры, которые нужно восстановить после использования.    
  106.           );
  107.    
  108. return psz1;   
  109. }  
  110.  
  111.  
  112. /////////////////////////////////////////////////////////  -masm=intel
  113. char* asm_strcat(char *psz1, const char *psz2)         //                
  114. {
  115.    
  116.     __asm("           mov  edi ,   %0         ;"
  117.           "           dec  edi                ;"   
  118.           " L_03:     inc  edi                ;"   
  119.           "           mov   al , [edi]        ;"   
  120.           "           or    al ,    0         ;"                   
  121.           "           jnz  L_03               ;"    
  122.           "           mov  esi ,   %1         ;"
  123.           " L_04:     mov   al , [esi]        ;"       
  124.           "           mov [edi],   al         ;"
  125.           "           or    al ,    0         ;"
  126.           "           jz   L_05               ;"       //  Так тоже можно завершить строку.
  127.           "           inc  esi                ;"
  128.           "           inc  edi                ;"   
  129.           "           jmp  L_04               ;"
  130.           " L_05:                             ;"         
  131.           //    - - - - - - - - - - - - - - - -
  132.           :: "m"(psz1), "m"(psz2)
  133.            : "%eax", "%esi", "%edi"                    //  Регистры, которые нужно восстановить после использования.    
  134.           );
  135.    
  136. return psz1;   
  137. }  
  138.  
  139. #endif
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146. /////////////////////////////////////////////////////////
  147. char* str_cpy(char *psz1, const char *psz2)            //
  148. {  
  149.     int   i =    0;
  150.    
  151.     while(psz2[i] != 0) psz1[i] = psz2[i++];
  152.        
  153.     psz1[i] = 0;  
  154.      
  155. return psz1;     
  156. }
  157.  
  158. /////////////////////////////////////////////////////////
  159. char* str_cat(char *psz1, const char *psz2)            //
  160. {  
  161.     int   i =    0,
  162.           k =    0;
  163.    
  164.     while(psz1[++k]);      
  165.     while(psz2[i] != 0) psz1[i+k] = psz2[i++];
  166.        
  167.     psz1[i+k] = 0;  
  168.      
  169. return psz1;     
  170. }
  171.  
  172.  
  173. /////////////////////////////////////////////////////////
  174. void monitor(char *psz)                                //
  175. {
  176.     int i = 0;       printf("\n We print from the \"monitor\" function:\n");  
  177.                      printf("Codes of all characters in the psz string:\n");
  178.      while(psz[i]) { printf("psz[%2d] = %c = %3d\n", i, psz[i], psz[i]); i++; }
  179.                      printf("psz[%2d] = %c = %3d\n", i, psz[i], psz[i]);  
  180. }
  181.  
  182.  
  183.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement