Лекция 1
.pdfКраткое введение в 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 |