goto int main int argc if argc 1

  • Slides: 20
Download presentation

Моделирование ориентированного графа управления � Средства реализации ◦ Узел метка с характерным названием ◦

Моделирование ориентированного графа управления � Средства реализации ◦ Узел метка с характерным названием ◦ Дуга оператор «goto» int main( int argc) { if ( argc > 1 ) { return 1; } else { return 0; } } sint 32_t main( sint 32_t A 1) { Rs( 0) = A 1; /* CFG Start Node 0 */ nodestart 0: goto nodeif 8; /* CFG If Node 8 */ nodeif 8: /* 25. MOVs Rs 0 Vs(1) = Rs(0); /* 42. CMPLEs Vs 1 Ps(0) = ( Vs(1) <= 1 ); /* 9. CTPD C 0 = &&nodereturn 2; /* 10. BRANCH C 0 if ( !Ps(0) ) goto *C 0; /* 11. END goto nodereturn 3; . . . /* CFG Stop Node 4 */ nodestop 4: return ( result); }/* main */ */ */

Моделирование типов переменных � � Базовые типы переменных (char, int, float и т. д.

Моделирование типов переменных � � Базовые типы переменных (char, int, float и т. д. ) Сложные типы переменных – все типы использованные в исходной программе в моделирующем коде восстановлены с помощью эквивалентных средств языка Си typedef struct node { char n_type; char n_flags; union { struct xsym {. . . } n_xsym; struct xint { long xi_int; } n_xint; struct xfloat { float xf_float; } n_xfloat; } n_info; } NODE; struct xsym {. . . }; struct xint { long xi_int; }; struct xfloat { float xf_float; }; typedef union { struct xsym n_xsym; struct xint n_xint; struct xfloat n_xfloat; }class 152711628_t; struct node { sint 8_t n_type; sint 8_t n_flags; class 152711628_t n_info; };

Пример вызова функции и смоделированного стека данных Смоделированный код исходной программы Реперные точки стека

Пример вызова функции и смоделированного стека данных Смоделированный код исходной программы Реперные точки стека Обработка параметров функции void foo( struct TEST A 1, sint 16_t A 2, sint 8_t A 3, sint 32_t A 4, float 64_t A 5, sint 64_t A 6, sint 32_t A 7, sint 32_t A 8, sint 32_t A 9, sint 32_t A 10, sint 32_t A 11) { Def. T_t( R, 1024) = {0}; . . . sint 8_t Stack[size_S] = {0}; Rs( 8) = Stack + size_S; Rs( 9) = Stack; memcpy( &Rd( 0), ( &A 1) + 0), 8); memcpy( &Rd( 1), ( &A 1) + 8), 8); memcpy( &Rd( 2), ( &A 1) + 16), 8); Rs( 3) = A 2; Rs( 4) = A 3; Rs( 5) = A 4; Rd( 6) = A 5; Rd( 7) = A 6; Rs( 8) -= 104; *(Rs( 8) + 64) = A 7; memset( (Rs( 8) + 68), 0, 4); *(Rs( 8) + 72) = A 8; memset( (Rs( 8) + 76), 0, 4); *(Rs( 8) + 80) = A 9; memset( (Rs( 8) + 84), 0, 4); *(Rs( 8) + 88) = A 10; memset( (Rs( 8) + 92), 0, 4); *(Rs( 8) + 96) = A 11; memset( (Rs( 8) + 100), 0, 4); . . . }

Пример вызова функции и смоделированного стека данных Инициализация регистра подготовки передачи управления sint 32_t

Пример вызова функции и смоделированного стека данных Инициализация регистра подготовки передачи управления sint 32_t main( void) {. . . /* 30. CTPDCR C 0 = &foo; /* 31. CALL [DISP 2 `foo`] C 0 -> C 0 // 30 */ { struct TEST t 1_31; memcpy( (&t 1_31 + 0), &Bd( 0), 8); memcpy( (&t 1_31 + 8), &Bd( 1), 8); memcpy( (&t 1_31 + 16), &Bd( 2), 8); { sint 16_t t 2_31 = Bs(3); { sint 8_t t 3_31 = Bs(4); { sint 32_t t 4_31 = Bs(5); { float 64_t t 5_31 = Bd(6); { sint 64_t t 6_31 = Bd(7); { sint 32_t t 7_31 = *(Rs( 9) + 64); { sint 32_t t 8_31 = *(Rs( 9) + 72); { sint 32_t t 9_31 = *(Rs( 9) + 80); { sint 32_t t 10_31 = *(Rs( 9) + 88); { sint 32_t t 11_31 = *(Rs( 9) + 96); { typedef void proc_31( struct TEST, sint 16_t, sint 8_t, sint 32_t, float 64_t, sint 32_t, sint 32_t); ((proc_31 *)C 0)(t 1_31, t 2_31, t 3_31, t 4_31, t 5_31, t 6_31, t 7_31, t 8_31, t 9_31, t 10_31, t 11_31); } }}}}}} Подготовка переменных Вызов по косвенности . . . }

Моделирование асинхронной предподкачки Чтение из буфера APB Начало асинхронной в Начинается загрузка предподкачки программы

Моделирование асинхронной предподкачки Чтение из буфера APB Начало асинхронной в Начинается загрузка предподкачки программы буфер APB Инициализация регистров доступа асинхронной предподкачки в APB к массиву int foo ( int ar[]) { int i, sum; for ( i = 0; i < 100; i++ ) { sum += ar[i]; } return (int)(sum/100); } int main ( void) { int i, a[100]; for ( i = 0; i < 100; i++ ) { a[i] = i; } printf( "Average = %dn", foo( a)); return 0; }` node 51 nodeif 50: if( !Was_Prefetch ) CTPL { AAU Was_Prefetch = 1; BAP Introduce. LDOVL( &apb, 255); BAP( &apb, 0, -1); } node 52: /* 129. ENTER node 51: /* 140. 130. ENTER SHLs Vs 0 0 x 2 -> Vs 4 /* 138. ENTER node 50 /* END << 2); Vs(4)141. = (Vs(0) /* 145. MOVs 0 x 64 -> Vs 10 STOP_APB( &apb); Vs(10). i = 100; goto nodereturn 4; /* 164. MOVAW No. 0 ind 0 MOVA am 1 -> Vs 6. . . Vs(6) = mova( 0, 0, 1, 1, &apb); /* 159. ADDs Vs 14 Vs 2 -> Vs 3 Vs(3) = (Vs(14) + Vs(2)); /* 132. ADDs Vs 1 Vs 6 -> Vs 1 Vs(1) = (Vs(1) + Vs(6)); /* 160. AAURWs Vs 3 -> AAIND(1) = Vs(3); /* 133. ADDs Vs 0 -> Vs 0 node 0 x 1 52 Vs(0) = (Vs(0) + 1); /* 157. CTPL -> C 1 AAIND( 0) = 0; Остановка асинхронной предподкачки /* 134. CMPLs Vs 0 0 x 64 EAP-> P 1 [T] AAINCR( 0) = 1; Ps(1) = (Vs(0) < 100); CTPL_node = &&continue_157; goto node 53; /* 135. CTPD -> C 0 continue_157: C 0 = &&nodeif 50; /* 163. AAURWq Vq 128 /* 136. BRANCH C 0 AAD(0) = Vd(128); if ( Ps(1) ) *(&AAD(0) + 1)= *(&Vd(128) + 1); goto *C 0; /* /* goto 139. END 137. END nodeif 50; node 52; -> AAD P 1 [T] // 6 */ //86*/ */ // // //66*/ */ // 6 */ // 8 */ // 6 */ // 6 */ // 6 */