Использование утилиты

Здесь вы можете посмотреть работу утилиты DeMono на базовых и собственных примерах.
Утилита на вход получает ассемблерный код (дизассемблированный продуктом IDA Pro с использованием авторского IDC-скрипт и генерирует его алгоритмизированное представление – алгоритмы и архитектуру. Пользователь имеет возможность на основании сгенерированного кода внести корректировки в ассемблерный код и повторно запустить утилиту.

Тестирование утилиты

Сервис для алгоритмизация пользовательского кода находится в разработке.
Далее представлены основные примеры реальной работы утилиты.


  1. Функция максимального из 2-х чисел max2()

  2. Вход утилиты:

    max2(X:r3, Y:r4) {
        0x00000001:  max2:           // { x(r3), y(r4), t(r5)
        0x00000002:  cmpw r3, r4     //   if(x > y)
        0x00000003:  ble label_1     //   {
        0x00000004:  mr r5, r3       //     t = x;
        0x00000005:  b label_2       //   }
        0x00000006:  label_1:        //   else {
        0x00000007:  mr r5, r4       //     t  = y;
        0x00000008:  label_2:        //   }
        0x00000009:  mr r3, r5       //   return n;
        0x0000000A:  blr             // }
    }
    

    Выход утилиты:

    (r3) max2(X, Y) {
      if (X > Y) {
        Y = X;
      }
      return Y;
    }

  3. Функция максимального из 3-х чисел max3()

  4. Вход утилиты:

    max3(X:r3, Y:r4, Z:r5){
        0x00000001:  max3:              // { x(r3), y(r4), z(r5), m(r6), n(r7)
        0x00000002:  cmpw r3, r4        //   if(x > y)
        0x00000003:  ble label_1        //     {
        0x00000004:  mr r6, r3          //         m = x;
        0x00000005:  b label_2          //     }
        0x00000006:  label_1:           //     else {
        0x00000007:  mr r6, r4          //         m  = y;
        0x00000008:  label_2:           //     }
        0x00000009:  cmpw r6, r5        //     if(m > z)
        0x0000000A:  ble label_3        //     {
        0x0000000B:  mr r7, r6          //         n = m;
        0x0000000C:  b label_4          //     }
        0x0000000D:  label_3:           //     else {
        0x0000000E:  mr r7, r5          //         n = z;
        0x0000000F:  label_4:           //     }
        0x00000010:  mr r3, r7          //     return n;
        0x00000011:  blr                // }
    }
    

    Выход утилиты:

    (r3) max3(X, Y, Z) {
      if (X > Y) {
        Y = X;
      }
      if (Y > Z) {
        Z = Y;
      }
      return Z;
    }

  5. Функция вычисления длины строки strlen()

  6. Вход утилиты:

    // Function 'strlen' {0x820FE8FC-0x820FE930}
    (r3) strlen(str:r3){
    	0x820FE8FC:  strlen:
    	0x820FE8FC:    mr        r9, r3                     // Move Register
    	0x820FE900:    cmpwi     r3, 0                      // Compare Word Immediate
    	0x820FE904:    bne       loc_820FE910               // Branch if not equal
    	0x820FE908:    li        r3, 0                      // Load Immediate
    	0x820FE90C:    blr                                  // Branch unconditionally
    	0x820FE910:  loc_820FE910:
    	0x820FE910:    lbz       r0, 0(r3)                  // Load Byte and Zero
    	0x820FE914:    cmpwi     r0, 0                      // Compare Word Immediate
    	0x820FE918:    beq       loc_820FE928               // Branch if equal
    	0x820FE91C:  loc_820FE91C:
    	0x820FE91C:    lbzu      r0, 1(r3)                  // Load Byte and Zero with Update
    	0x820FE920:    cmpwi     r0, 0                      // Compare Word Immediate
    	0x820FE924:    bne       loc_820FE91C               // Branch if not equal
    	0x820FE928:  loc_820FE928:
    	0x820FE928:    subf      r3, r9, r3                 // Subtract from
    	0x820FE92C:    blr                                  // Branch unconditionally
    }
    

    Выход утилиты:

    (r3) strlen(str) {
      @w2 = str;
      if (str != 0) {
        if (*str != 0) {
          loop {
            ++str;
          } (*str != 0) ;
        }
        str -= @w2;
      } else {
        str = 0;
      }
      return str;
    }

  7. Функция нахождения старшего бита числа

  8. Вход утилиты:

    (r3) bit_high(X: r3){
        0x00000000: bit_high:
    
        0x00000000: mr r8, r3              // Move Register
        0x00000000: li r3, 0               // Load Immediate
        0x00000000: li r10, 32             // Load Immediate
        0x00000000: li r11, 4              // Load Immediate
    
        0x00000000: loc_81CA2A0C:
        0x00000000: add r0, r3, r10         // Add
        0x00000000: srwi r9, r0, 1          // Shift Right Immediate
        0x00000000: srw. r0, r8, r9         // Shift Right Word
        0x00000000: beq loc_81CA2A24        // Branch if equal
        0x00000000: mr r3, r9               // Move Register
        0x00000000: b loc_81CA2A28          // Branch
    
        0x00000000: loc_81CA2A24:
        0x00000000: mr r10, r9              // Move Register
    
        0x00000000: loc_81CA2A28:
        0x00000000: addic. r11, r11, -1     // Add Immediate Carrying
        0x00000000: bge loc_81CA2A0C        // Branch if greater than or equal
    
        0x00000000: blr                     // Branch unconditionally
    }
    

    Выход утилиты:

    (r3) bit_high(X) {
      _w2 = 0;
      @w3 = 32;
      @w5 = 4;
      loop {
        @w4 = (_w2 + @w3) / 2;
        if (X >> @w4 == 0) {
          @w3 = @w4;
        } else {
          _w2 = @w4;
        }
        --@w5;
      } (@w5 >= 0) ;
      return _w2;
    }

  9. Пример взаимодействия модулей

  10. Вход утилиты:

    var xxx & 0x00001001;
    zero_xxx_fromExt(){
    	0x00000000: li        r3, 0
    	0x00000000: lis       r4, xxx@h
    	0x00000000: stw       r3, xxx@l(r4)
    	0x00000000: blr
    }
    
    inc_xxx(){
    	0x00000000: lis       r4, xxx@h
    	0x00000000: lwz       r4, xxx@l(r4)
    	0x00000000: addi      r3, r4, 1
    	0x00000000: lis       r4, xxx@h
    	0x00000000: stw       r3, xxx@l(r4)
    	0x00000000: blr
    }
    dec_xxx(){
    	0x00000000: lis       r4, xxx@h
    	0x00000000: lwz       r4, xxx@l(r4)
    	0x00000000: addi      r3, r4, -1
    	0x00000000: lis       r4, xxx@h
    	0x00000000: stw       r3, xxx@l(r4)
    	0x00000000: blr
    }
    set_xxx(){
    	0x00000000: lis       r4, xxx@h
    	0x00000000: lwz       r4, xxx@l(r4)
    	0x00000000: lis       r4, xxx@h
    	0x00000000: stw       r3, xxx@l(r4)
    	0x00000000: blr
    }
    get_xxx(){
    	0x00000000: lis       r3, xxx@h
    	0x00000000: lwz       r3, xxx@l(r3)
    	0x00000000: blr
    }
    
    var yyy & 0x00001002;
    inc_yyy(){
    	0x00000000: lis       r4, yyy@h
    	0x00000000: lwz       r4, yyy@l(r4)
    	0x00000000: addi      r3, r4, 1
    	0x00000000: lis       r4, yyy@h
    	0x00000000: stw       r3, yyy@l(r4)
    	0x00000000: bl        zero_xxx_fromExt
    	0x00000000: blr
    }
    dec_yyy(){
    	0x00000000: lis       r4, yyy@h
    	0x00000000: lwz       r4, yyy@l(r4)
    	0x00000000: addi      r3, r4, -1
    	0x00000000: lis       r4, yyy@h
    	0x00000000: stw       r3, yyy@l(r4)
    	0x00000000: bl        zero_xxx_fromExt
    	0x00000000: blr
    }
    set_yyy(){
    	0x00000000: lis       r4, yyy@h
    	0x00000000: lwz       r4, yyy@l(r4)
    	0x00000000: lis       r4, yyy@h
    	0x00000000: stw       r3, yyy@l(r4)
    	0x00000000: bl        zero_xxx_fromExt
    	0x00000000: blr
    }
    get_yyy(){
    	0x00000000: lis       r3, yyy@h
    	0x00000000: lwz       r3, yyy@l(r3)
    	0x00000000: blr
    }
    

    Выход утилиты:

    module M_1 {
      /* zero_xxx_fromExt() - Interface (nCall = 3) */;
      var xxx & 0x1001;
      () dec_xxx() {
        --xxx;
        return ();
      }
      (r3) get_xxx() {
        return xxx;
      }
      () inc_xxx() {
        ++xxx;
        return ();
      }
      () set_xxx(w1_) {
        xxx = w1_;
        return ();
      }
      () zero_xxx_fromExt() {
        xxx = 0x0;
        return ();
      }
    }
    module M_2 {
      var yyy & 0x1002;
      () dec_yyy() {
        --yyy;
        () = zero_xxx_fromExt();
        return ();
      }
      (r3) get_yyy() {
        return yyy;
      }
      () inc_yyy() {
        ++yyy;
        () = zero_xxx_fromExt();
        return ();
      }
      () set_yyy(w1_) {
        yyy = w1_;
        () = zero_xxx_fromExt();
        return ();
      }
    }