Скачиваний:
7
Добавлен:
27.03.2022
Размер:
456.28 Кб
Скачать

Краткое введение в assembler

Краткое введение в C

Оператор ветвления if-else

1 // even_odd .c

 

2

# include < stdio .h >

 

3

# include < stdlib .h >

 

4

 

 

5 int main ( int argc , char

* argv [])

6

{

 

7srand ( time ( NULL ));

8 const int r = rand ();

9if (r % 2 == 0)

10printf ("%d is even number \n", r);

11else

12printf ("%d is odd number \n", r);

13return 0;

14}

$ gcc -c even_odd.c -o even_odd.o && gcc even_odd.o -o even_odd $ for i in `seq 0 2`; do

>./even_odd

>sleep 1

>done

1266093312 is even number

953012229 is odd number

652176710 is even number

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

30/38

Краткое введение в assembler

 

Краткое введение в C

 

Оператор выбора switch-case

1

//

number .c

$ gcc -c number.c -o number.o

2

# include

< stdio .h >

$ gcc number.o -o number

3

# include

< stdlib .h >

$ ./number

 

4 int

main ( int argc , char * argv [])

$ ./number

1

5

{

 

 

one

 

6

 

if ( argc < 2) return 1;

$ ./number

2

7

 

const

int n = atoi ( argv [1]);

two

 

8

 

switch (n)

$ ./number

3

9

 

{

 

three

 

10

 

case

1:

$ ./number

4

11

 

printf (" one \n" );

I forgot

 

12

 

break ;

$ ./number

5

13

 

case

2:

I forgot

 

14

 

printf (" two \n" );

$ ./number

6

15

 

break ;

I forgot

 

16

 

case

3:

$ ./number

7

17

 

printf (" three \n" );

I forgot

 

18

 

break ;

$ ./number

8

19

 

case

4:

I forgot

 

20

 

case

5:

$ ./number

9

21

 

case

6:

I forgot

 

22

 

case

7:

$ ./number

0

23

 

case

8:

I don't know

24

 

case

9:

$ ./number

10

25

 

printf ("I forgot \n");

I don't know

26

 

break ;

$ ./number -1

27

 

default :

I don't know

28printf ("I don 't know \n");

29break ;

30}

31return 0;

32}

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

31/38

Краткое введение в assembler

Краткое введение в C

Цикл со счетчиком

 

1 // sum_for .c

 

2

# include < stdio .h >

 

3

 

 

4 int main ( int argc , char

* argv [])

5

{

 

6printf (" Enter a non - negative number : ");

7 int n = 0;

8scanf ("%d", &n);

9if (n < 0) return 1;

10 int i = 1, s = 0;

11for (; i <= n; ++i)

12s += i;

13printf ("0 + ... + %d = %d\n", n, s);

14return 0;

15}

$ gcc -c sum_for.c -o sum_for.o $ gcc sum_for.o -o sum_for

$ ./sum_for

Enter a non-negative number: 7 0 + ... + 7 = 28

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

32/38

Краткое введение в assembler

Краткое введение в C

Цикл с предусловием

1 // sum_while .c

 

2

# include < stdio .h >

 

3

 

 

4 int main ( int argc ,

char * argv [])

5

{

 

6printf (" Enter a non - negative number : ");

7 int n = 0;

8scanf ("%d", &n);

9if (n < 0) return 1;

10 int i = 0, s = 0;

11while (++i <= n)

12s += i;

13printf ("0 + ... + %d = %d\n", n, s);

14return 0;

15}

$ gcc -c sum_while.c -o sum_while.o $ gcc sum_while.o -o sum_while

$ ./sum_while

Enter a non-negative number: 7 0 + ... + 7 = 28

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

33/38

Краткое введение в assembler

Краткое введение в C

Цикл с постусловием

1 // sum_do_while .c

 

2

# include < stdio .h >

 

3

 

 

4 int main ( int argc ,

char * argv [])

5

{

 

6printf (" Enter a non - negative number : ");

7 int n = 0;

8scanf ("%d", &n);

9if (n < 0) return 1;

10 int i = 0, s = 0;

11do

12s += i;

13while (++i <= n);

14printf ("0 + ... + %d = %d\n", n, s);

15return 0;

16}

$ gcc -c sum_do_while.c -o sum_do_while.o $ gcc sum_do_while.o -o sum_do_while

$ ./sum_do_while

Enter a non-negative number: 7 0 + ... + 7 = 28

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

34/38

Краткое введение в assembler

Краткое введение в C

Цикл через оператор goto

1 // sum_goto .c

 

2

# include < stdio .h >

 

3

 

 

4 int main ( int argc ,

char * argv [])

5

{

 

6printf (" Enter a non - negative number : ");

7 int n = 0;

8scanf ("%d", &n);

9if (n < 0) return 1;

10 int i = 0, s = 0;

11lab:

12s += i;

13if (++i <= n)

14goto lab;

15printf ("0 + ... + %d = %d\n", n, s);

16return 0;

17}

$ gcc -c sum_goto.c -o sum_goto.o $ gcc sum_goto.o -o sum_goto

$ ./sum_goto

Enter a non-negative number: 7 0 + ... + 7 = 28

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

35/38

Краткое введение в assembler

 

 

 

 

 

Краткое введение в C

 

Рекурсивное вычисление чисел Фибоначчи

1

// rec_fib .c

 

 

 

 

$ gcc -c

rec_fib.c -o rec_fib.o

 

 

 

 

2

# include < stdio .h >

 

 

 

 

$ gcc rec_fib.o -o rec_fib

3

 

 

 

 

 

 

$ for i in `seq 0 20`; do

4 int

fib ( int n)

 

 

 

 

echo $i | ./rec_fib |

5

{

 

 

 

 

 

sed -e 's/^.\+: // ';

6

 

if (n == 0 || n == 1)

 

 

done

 

7

 

return n;

 

 

 

 

fib(0) = 0

8

 

return fib (n -

1) +

fib (n

-

2);

fib(1) = 1

9

}

 

 

 

 

 

fib(2) = 1

10

 

 

 

 

 

 

fib(3) = 2

11 int

main ( int argc ,

char

* argv [])

 

fib(4) = 3

12

{

 

 

 

 

 

fib(5) = 5

13

 

printf (" Enter a non - negative number : ");

fib(6) = 8

14

 

int n = 0;

 

 

 

 

fib(7) = 13

15

 

scanf ("%d", &n);

 

 

 

fib(8) = 21

16

 

if (n < 0) return 1;

 

 

 

fib(9) = 34

17

 

printf ("fib (%d) = %d\n",

n,

fib(n));

fib(10) = 55

18

 

return 0;

 

 

 

 

fib(11) = 89

19

}

 

 

 

 

 

fib(12) = 144

 

 

 

 

 

 

 

fib(13) = 233

 

 

 

 

 

 

 

fib(14) = 377

 

 

 

 

 

 

 

fib(15) = 610

 

 

 

 

 

 

 

fib(16) = 987

 

 

 

 

 

 

 

fib(17) = 1597

 

 

 

 

 

 

 

fib(18) = 2584

 

 

 

 

 

 

 

fib(19) = 4181

 

 

 

 

 

 

 

fib(20) = 6765

 

 

 

 

 

 

 

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

36/38

Краткое введение в assembler

 

Краткое введение в C

 

Итеративное вычисление чисел Фибоначчи

1

// iter_fib .c

 

 

$ gcc -c

iter_fib.c -o iter_fib.o

 

 

2

# include < stdio .h >

$ gcc iter_fib.o -o iter_fib

3

 

 

 

 

 

 

$ for i in `seq 0 20`; do

4 int

fib ( int

n)

 

 

echo $i | ./iter_fib |

5

{

 

 

 

 

 

sed -e 's/^.\+: // ';

6

 

int a = 0, b = 1, c;

done

 

7

 

while

(n --

>

0)

fib(0) = 0

8

 

{

 

 

 

 

fib(1) = 1

9

 

c

=

a

+

b;

fib(2) = 1

10

 

a

=

b;

 

 

fib(3) = 2

11

 

b

=

c;

 

 

fib(4) = 3

12

 

}

 

 

 

 

fib(5) = 5

13

 

return

a;

 

 

fib(6) = 8

14

}

 

 

 

 

 

fib(7) = 13

15

 

 

 

 

 

 

fib(8) = 21

16 int

main ( int

argc , char * argv [])

fib(9) = 34

17

{

 

 

 

 

 

fib(10) = 55

18

 

printf (" Enter a non - negative number : ");

fib(11) = 89

19

 

int n

=

0;

 

 

fib(12) = 144

20

 

scanf ("%d", &n);

fib(13) = 233

21

 

if (n < 0) return 1;

fib(14) = 377

22

 

printf ("fib (%d) = %d\n", n, fib(n));

fib(15) = 610

23

 

return

0;

 

 

fib(16) = 987

24

}

 

 

 

 

 

fib(17) = 1597

 

 

 

 

 

 

 

fib(18) = 2584

 

 

 

 

 

 

 

fib(19) = 4181

 

 

 

 

 

 

 

fib(20) = 6765

 

 

 

 

 

 

 

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

37/38

Краткое введение в assembler

Краткое введение в C

 

 

Упражнения

1Реализовать программу рекурсивного вычисления факториала заданного числа на assembler

2Реализовать программу итеративного вычисления факториала заданного числа на assembler

3Реализовать программу рекурсивного вычисления факториала заданного числа на С

4Реализовать программу итеративного вычисления факториала заданного числа на С

5 Реализовать программу вычисления суммы ряда 112 + 212 + 312 + 412 + + n12 (íà Ñ èëè assembler)

Браницкий А.А., СПбГУТ

Лекция 1, Санкт-Петербург, 2021

38/38

Соседние файлы в предмете Эксплуатация уязвимостей программного обеспечения