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

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

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

 

 

Арифметические операторы (ADD)

ADD SUM, NUM

Сложение двух чисел, представленных аргументами SUM и NUM. Результат помещается в SUM.

SUM:

Область памяти Регистр общего назначения NUM:

Область памяти Регистр общего назначения

Непосредственное значение, например, число Пример: ADD EAX, 10

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

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

20/38

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

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

 

 

Арифметические операторы (SUB)

SUB DIF, NUM

Вычитание одного числа из другого, представленных аргументами DIF и NUM. Результат помещается в DIF. DIF:

Область памяти Регистр общего назначения NUM:

Область памяти Регистр общего назначения

Непосредственное значение, например, число Пример: SUB EAX, 10

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

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

21/38

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

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

 

 

Арифметические операторы (MUL)

MUL NUM

Умножение двух чисел, представленных аргументами (1) регистром AL (если размер NUM 1 байт) и NUM, (2) регистром AX (если размер NUM 2 байта) и NUM, (3) регистром EAX (если размер NUM 4 байта) и NUM. Результат помещается в (1) регистр AX, если размер NUM 1 байт, (2) пару регистров (DX:AX), если размер NUM 2 байта,

(3) пару регистров (EDX:EAX), если размер NUM 4 байта. NUM:

Область памяти Регистр общего назначения Пример: MUL BX

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

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

22/38

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

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

 

 

Арифметические операторы (DIV)

DIV NUM

Частное от двух чисел, представленных аргументами (1) регистром AX (если размер NUM 1 байт) и NUM, (2) парой регистров (DX:AX) (если размер NUM 2 байта) и NUM, (3) парой регистров (EDX:EAX) (если размер NUM 4 байта) и NUM. Результат целочисленного деления помещается в (1) регистр AL, если размер NUM 1 байт, (2) регистр AX, если размер NUM 2 байта, (3) регистр EAX, если размер NUM 2 байта. Результат остатка от деления помещается в (1) регистр AH, если размер NUM 1 байт, (2) регистр DX, если размер NUM 2 байта, (3) регистр EDX, если размер NUM 4 байта. NUM:

Область памяти Регистр общего назначения Пример: DIV BX

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

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

23/38

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

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

 

 

Арифметические операторы (IMUL)

Формы IMUL:

IMUL NUM. Работает аналогично MUL NUM.

IMUL PROD, NUM. PROD := PROD * NUM. Ограничения: не работает с однобайтовыми операндами.

IMUL PROD, NUM1, NUM2. PROD := NUM1 * NUM2. Ограничения: не работает с однобайтовыми операндами, NUM2 непосредственное значение.

Пример: IMUL DX, BX, 10

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

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

24/38

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

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

 

 

Числа Фибоначчи

Числа Фибоначчи числовая последовательность, в которой каждый следующий элемент равен сумме двух предыдущих. Рекурсивное определение:

( 0; åñëè n = 0

Fibn = 1; åñëè n = 1

F ibn 1 + F ibn 2; åñëè n > 2:

Итеративное определение:

def fib(n) do a, b <- 0, 1

while (n-- > 0) do a, b <- b, a + b

od return a

od

0; 1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 89; 144; 233; 377; 610; 987; 1597; 2584; 4181; 6765

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

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

25/38

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

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

1

; rec_fib . asm

 

28 _start :

 

 

2 % include " print . inc "

29

mov

eax ,

NUMBER

3 global

_start

 

30

cmp

eax ,

0

4 section

 

. data

 

31

jl lab1

 

5

NUMBER equ 10

32

call

fib

 

6

EXIT_CODE equ 1

33

call print_number

7

RET_VAL equ 0

34

mov

eax ,

10

8 section

 

. text

 

35

call print_symbol

9

; input

 

argument : in eax

36 lab1 :

 

 

10

; return value : in eax

37

mov eax , EXIT_CODE

11 fib :

 

 

 

38

mov ebx , RET_VAL

12

cmp

 

eax ,

0

39

int

0 x80

 

13

je

fib_lab1

 

$ nasm -f elf rec_fib.asm -o rec_fib.o

14

cmp

 

eax ,

1

 

15

je

fib_lab1

 

$ ld -m elf_i386 rec_fib.o -o rec_fib

16

dec

 

eax

 

 

$ ./rec_fib

 

17

push

eax

 

 

55

 

 

18

call

fib

 

 

$ for i in

seq 0 20 ; do \

19

mov

 

ebx ,

eax

 

perl -pi -e "s/NUMBER equ ([0-9]+)$/NUMBER equ ${i}/" rec_fib.asm; \

20

pop

 

eax

 

 

nasm -f elf rec_fib.asm -o rec_fib.o; \

21

dec

 

eax

 

 

ld -m elf_i386 rec_fib.o -o rec_fib; \

 

 

 

./rec_fib; \

 

22

push

ebx

 

 

 

 

 

done

 

 

23

call

fib

 

 

 

 

 

 

0

 

 

24

pop

 

ebx

 

 

 

 

 

 

 

1

 

 

25

add

 

eax ,

ebx

 

...

 

 

26 fib_lab1 :

 

 

6765

 

 

27

ret

 

 

 

 

 

 

 

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

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

26/38

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

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

1

; iter_fib . asm

29 _start :

 

 

2 % include " print . inc "

30

mov

eax ,

NUMBER

3 global

_start

 

31

cmp

eax ,

0

4 section

. data

 

32

jl lab1

 

5

NUMBER equ 17

33

call

fib

 

6

EXIT_CODE equ 1

34

call print_number

7

RET_VAL equ 0

35

mov

eax ,

10

8 section

. text

 

36

call print_symbol

9

; input

argument : in eax

37 lab1 :

 

 

10

; return value : in eax

38

mov eax , EXIT_CODE

11 fib :

 

 

39

mov ebx , RET_VAL

12

cmp

eax ,

0

40

int

0 x80

 

13

je

fib_lab1

 

$ nasm -f elf iter_fib.asm -o iter_fib.o

14

cmp

eax ,

1

 

15

je

fib_lab1

 

$ ld -m elf_i386 iter_fib.o -o iter_fib

16

mov

ecx ,

eax

 

$ ./iter_fib

 

17

dec

ecx

 

 

55

 

 

18

xor

eax ,

eax

 

$ for i in

seq 0 20 ; do \

19

mov

ebx ,

1

 

perl -pi -e "s/NUMBER equ ([0-9]+)$/NUMBER equ ${i}/" iter_fib.asm; \

20 fib_lab2 :

 

 

nasm -f elf iter_fib.asm -o iter_fib.o; \

21

mov

edx ,

eax

 

ld -m elf_i386 iter_fib.o -o iter_fib; \

 

./iter_fib; \

 

22

add

edx ,

ebx

 

 

 

done

 

 

23

mov

eax ,

ebx

 

 

 

 

0

 

 

24

mov

ebx ,

edx

 

 

 

 

1

 

 

25

loop fib_lab2

 

...

 

 

26

mov

eax ,

ebx

 

6765

 

 

27fib_lab1 :

28ret

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

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

27/38

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

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

 

 

История создания C

1958 г. разработан ALGOL 58 (ALGorithmic Language) (Джон Бэкус, Джозеф Уэгстен, Джон Маккарти, Петер Наур, Эдсгер Дейкстра)

1963 г. разработан язык программирования CPL совместными усилиями сотрудников кембриджского и лондонского университетов (Кристофер Стрейчи, Дэвид Бэррон и др.)

1966 г. Мартин Ричардс разработал язык программирования BCPL (Basic Combined Programming Language)

1969 г. Кен Томпсон и Деннис Ритчи реализовали язык программирования B (бестипный), прообраз C, предназначенный для первой ОС UNIX на ЭВМ PDP-7 1972 г. Кен Томпсон и Деннис Ритчи реализовали язык программирования C, использующийся при разработке ядра Linux и многих прикладных программ

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

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

28/38

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

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

 

 

Hello world!

1 // hello_world .c

 

2

# include < stdio .h >

 

3

 

 

4 int main ( int argc ,

char * argv [])

5

{

 

6

printf (" Hello

world !\n");

7

return 0;

 

8}

$ gcc -c hello_world.c -o hello_world.o $ gcc hello_world.o -o hello_world

$ ./hello_world Hello world!

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

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

29/38

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