РЕГИСТРЫ EAX, EBX, ECX, EDX, ESI, EDI, EBP (32-разрядные регистры)называются регистрами общего назначения и могут свободно участвовать в любых математических операциях или операциях обращения к памяти.
Каждый персональный компьютер имеет микропроцессор, который управляет действиями компьютера - арифмитические, логические действия и контролирует работу компьютера. Каждое семейство процессоров имеет свои инструкции для выполнения различных операций таких как ввод и вывод с клавиатуры, вывод информации на экран и т.д. Этот набор инструкций назыв. МАШИННЫЙ ЯЗЫК.
Компьютер понимает только машинный язык, который состоит из 0 и 1 -> выключено/включено. Машинный язык очень трудный для разработки, поэтому создали язык низкого уровня - ассемблер.
Язык Ассемблер обеспечивает
- интерфейс программы на ОС, процессор, BIOS
- представление данных в памяти и других внешних носителей
- как процессор получает и выполняет инструкции
- как инструкции получают и обрабатывают данные
- как программа взаимодействует с внешнеми носителями
Процессор
Главное внутреннее ядро процессора состоит из
- процессор
- память
- регистры
РЕГИСТРЫ - составные части процессора, которые ХРАНЯТ ДАННЫЕ И АДРЕСА
Для выполнения программы, система копирует данные из внешнего носителя во внутреннюю память. Процессор вполняет инструкции программы.
Фундаментальная единица компьютера для хранения данных - БИТ.
Бит - может быть 0 или 1.
Байт - 8 бит + 1 парный.
Процессор поддерживает следующие размеры данных:
Word -> a 2-byte (16 bit) data item
Doubleword -> 4-byte (32 bit) data item
Quadword -> 8-byte (64 bit) data item
Paragaph -> 16-byte (128 bit) area
Kilobyte -> 1024 byte
Megabyte -> 1,048,576 bytes
Positional notation - Позиционное обозначение
Bit value 1 1 1 1 1 1 1
Position value as
power of base 2 128 64 32 16 8 4 2 1 Значение позиции основание 2
Bit number 7 6 5 4 3 2 1 0
Binary data - двоичные данные
Decimal Binary Hexadecimal
0 0 0
1 1 1
2 10 2
3 11 3
4 100 4
5 101 5
6 110 6
7 111 7
8 1000 8
9 1001 9
10 1010 A
11 1011 B
12 1100 C
13 1101 D
14 1110 E
15 1111 F
АДРЕСАЦИЯ ДАННЫЕ В ПАМЯТИ
Процесс через который процессор контролирует исполнение инструкций ссылается на цикл -> fetch-decode-execute выборка-декодирование-исполение или цикл исполения. Он состоит из трех шагов:
- выборка инструкций из памяти
- декодирование или идентификация инструкций
- выполнение инструкций
Существует два типа адресной памяти - memory addresses
- ABSOLUTE ADDRESS - a direct reference of specific location.
Абсолютный адрес - прямая ссылка на конкретное место.
- SEGMENT ADDRESS (OFFSET) - starting address of a memory segment with the offset value. Адрес СЕГМЕНТА (offset) - начальный адрес сегмента памяти со значением сдвига.
БАЗОВЫЙ СИНТАКСИС - ASSEMBLY BASIC SYNTAX
Программа на ассемблере разделяется на три секции:
data section - инициализированных данных или констант
bss section - объявления переменных
text section - хранения кода
rdata section - Const/read-only (and initialized) data
idata section - contains information about all DLL files required by the program
rsrc section - holds information about the icon that is shown when looking at the
executable file in the Explorer
Sections ".idata", ".rdata", ".rsrc", ... do not contain program data (although their name ends with "data") but they contain meta information that is used by the operating system.
.text: Code
.data: Initialized data
.bss: Uninitialized data
.rdata: Const/read-only (and initialized) data
.edata: Export descriptors
.idata: Import descriptors
The DATA Section
data section - используется для объявление инициализированных данных или констант. Эти данные не изменяются в процессе выполнение. Можно объявлять переменные, константы, имена файлов, размер буфера и т.д.
The BSS Section
bss section - используется для объявления переменных.
The TEXT Section
text section - используется для хранения кода.
global_start - говорит ядру где начинает выполнятся программа
Программа на Ассемблере состоит из:
- инструкции для выполнения executable instruction, или инструкции
- дериктивы ассемблера и псевдооперации (pseudo-ops)
- макросы
Executable insctructions - инстркции выполнения - говорят процессору что делать. Каждая инструкция содержит код операции (псевдооперации). Каждая инструкция на выполнения генерирует инструкцию на машинном языке.
Assembler directives (pseudo-ops)
Псевдооперации - различные аспекты процесса ассемблера. Они не являются исполняемыми инструкциями и не генерируют инструкции машинного языка.
Macros
Механизм замещения текста
ПРИМЕР
INC COUNT ;Increment the memory variable COUNT, увеличение переменной COUNT
MOV TOTAL, 48 ;Transfer the value 48 in the memory variable TOTAL, перенос значения 48 в переменную TOTAL
ADD AH, BH ;Add the content of the BH register into the AH register, сложить значение регистра BH со значением регистра AH
AND MASK1, 128 ;Perform AND operation on the variable MASK1 and 128, логическая операция ИЛИ
ADD MARKS, 10 ;Add 10 to the variable(переменная) MARKS, прибавить 10 к значению переменной MARKS
MOV AL, 10 ;Transfer the value(значение) 10 to the AL register, перенести значение 10 в регистра AL
ПРИМЕР
section .text
global _start
_start:
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80
mov eax, 1 ;system call number (sys_write)
int 0x80
section .data
msg db 'Hello, world' , 0xa ;our dear string
len equ $ - msg ;length of our dear string
MEMORY SEGMENTS - СЕГМЕНТЫ ПАМЯТИ (Сегмент - участок)
Модель сегментарной памяти разделена на группы независимых сегментов ссылающихся на указатели в регистрах сегментах.
Каждый сегмент используется для
- хранения инструкции кода
- хранения данных
- содержит стек программы (СТЕК - веременная память)
DATA SEGMENT (СЕГМЕНТ - раздел памяти)
.data или .bss
Используется для хранения данных программы. Эта секция не может расширяться после того как все элементы объявлены.
Эта секция остатется - статичной.
.bss секция - тоже статичная и которая содержит данные буфера, которые будут объявлены позже в программе.
CODE SEGMENT (СЕГМЕНТ КОДА)
.text это раздел памяти где храниться инструкции кода. Это тоже фиксированная область.
STACK - СТЕК
Сегмент который содержит величины, данные проходящиее через функции и процедуры внутри программы
REGISTERS - РЕГИСТРЫ - ВНУТРЕННЯЯ ПАМЯТЬ
Действия процессора включают обработку данных. Эти данные хранятся в памяти и доступны. Чтение, запись и хранения данных в памяти сложный процесс и замедляет работу процессора так как вовлекает сложный процесс запроса прохождения данных через контрольную шину, память и обратных процесс.
Для того чтобы ускорить процесс обработки данных существует ВНУТРЕННЯЯ ПАМЯТЬ - РЕГИСТРЫ.
РЕГИСТРЫ - хранят элементы данных без доступа к памяти. Ограниченное количество регистров участвуют в простроении процессорного чипа.
РЕГИСТРЫ ПРОЦЕССОРА
В 32-разрядной архитектуре процессора присутствуют
- десять 32-бит и шесть 16-бит регистров
Регистры делятся на три категории:
- главные регистры
- контрольные регистры
- сегментные регистры
Главные регистры разделены на:
- data registers - данные
- pointer registers - указатели
- index registers - индекс
DATA REGISTERS - РЕГИСТРЫ ДАННЫХ
Для 32-разряд регистры используются для арифметических, логических и др. операций
- 32-битные регистры -> EAX, EBX, ECX, EDX
- нижние регистры использ как 16-битные -> AX, BX, CX, DX
- нижние регистры использ как 8-битные -> AH, AL, BH, BL, CH, CL, DH, DL
AX - (premary accumulation) превоначальное накопление используется в input/output и большинство арифмитических инструкций.
BX - (base register )основной регистр - ипользуется для индексации адресов
CX - (counter regeister) регистр графов - циклы и интерактивные операции
DX - (data register) регистр данных - используется в input/output, операции умножения, деления
POINTER REGISTERS - РЕГИСТРЫ УКАЗАТЕЛИ
Регистры указатели 32-битные EIP, ESP, EBP и 16-битные регистры IP, SP, BP
Три категории РЕГИСТРЫ УКАЗАТЕЛИ - POINTER REGISTERS:
- Instruction Pointer (IP) - УКАЗАТЕЛЬ ИНСТРУКЦИЙ
16-битный IP регистр хранит offset адреса для следующей инструкции которая должна быть выполнена.
IP ассоциирован с CS регистром (CS:IP) дает полный адрес текущей инструкции в сегменте кода.
Адрес СЕГМЕНТА (offset) - начальный адрес сегмента памяти со значением сдвига.
- Stack Pointer (SP) - УКАЗАТЕЛЬ СТЕКА
16-битный SP регистр обеспечивает значение стека offset в программе стека.
SP ассоциирован с SS регистром (SS:SP) ссылается на текущую позицию данных и адреса в стеке программы.
- Base Pointer (BP) - ОСНОВНОЙ УКАЗАТЕЛЬ
16-битный BP регистр в основном ссылается на параметр переменных проходящих через код.
Адрес SS регистр комбинирован со стеком в BP может быть также комбинирован с DI и SI как основной
регистр для специальной адресации.
INDEX REGISTER - ИНДЕКСАЦИЯ АДРЕСОВ (иногда используется в арифмитических операций)
32-bit -> ESI, EDI
16-bit -> SI, DI
Source Index (SI)- индекс источника
Destination Index (DI) - индекс местоназначения
CONTROL REGISTERS
32-битные инструкции указатели регистров и 32-битные флаги регистров - контрольные регистры.
Многие инструкции включют операции сравнения и математические вычисления. Флаги контролируют течение в другое местоположение (позицию)
ФЛАГИ
- Overflow Flag (OF) - ФЛАГ ПЕРЕПОЛНЕНИЯ
указывает поток переполнения на биты высшего порядка, арифмитические операции
- Direction Flag (DF) - ФЛАГ НАПРАВЛЕНИЯ
указывает правое или левое направление для движения или сравнения строчных данных.
Когда DF имеет значение 0, строчная операция перемещается слева-направо.
Когда DF имеет значение 1, строчная операция перемещается справа-налево.
- Interrupt Flag (IF) - ФЛАГ ПРЕРЫВАНИЯ
указывает где происходит прерывание - клавиатура, ввод.
0 - запрет прерывания
1 - возможность прерывания
Trap Flag (TF) - ФЛАГ ЛОВУШКИ
позволяет установить операцию процесора в пошаговом режиме. DEBUG программа.
мы может пошагово идти через выполение инструкции
Sign Flag (SF) - ФЛАГ ЗНАКА
указыает на арифмитические операции
0 - очищает значение
1- устанавливает 0 на результат
Zero Flag (ZF) - ФЛАГ НУЛЯ
указывает на арифмитическое действие или результат сравнения
Auxiliary Carry Flag (AF) вспомогательнаые флаг
используется для арифмитических операция
Prity Flag (PF)
арифмитические операции
Carry Flag (CF)
аримитические операции, shift, rotate opeartion -> операции сдвига и вращения
Code Segment - CS - сегмент кода
Содержит все инструкции которые должны быть исполнения. 16-битный Code Segment регистра или CS регистр содержит начала
адреса сегмента кода.РЕГИСТРЫ - хранят элементы данных без доступа к памяти.
Data Segment - DS - сегмент данных
Содержит данные, константы и рабочую площать 16-битный Data Segment или DS регистра хранит начальные data segment
Stack Segment - SS - сегмент стека
Содержит данные и адреса возврата процедуры или кода. Использутеся как СТЕК данных. - Стек - SS.
В Ассемблере, программа нуждается в доступе к памяти. Вся память внутри сегмента имеет отношени к начала адресации сегмента.
Вся инорфмация храниться с hex величинах.
SYSTEM CALLS - СИСТЕМНЫЕ ВЫЗОВЫ
System calls - системные вызовы - это API функции для взаимодействия пользователя и ядра.
Мы используем системные вызовы sys_write - для того что-нибудь написать на экране
sys_exit - выхода из режима
Регистры для системных вызовов
(80h) прерывание
EAX, EBX, EDX, ESI, EDI, EBP
REGISTER ADDRESSING
- register addressing - регистровая адресация
- immediate addressing - прямая адресация
- memeory addressing - адресация памяти
IMMEDIATE ADDRESSING - прямая адресация
В данном случае операнд имеет величину константу или выражение.
Приимер
BYTE_VALUE DB 150 ;A byte value is defined
WORD_VALUE DW 300 ;A word value is defined
ADD BYTE_VALUE, 65 ;An immediate operand 65 is added
MOV AX, 45H ;Immediate constant 45H is transferred
DIRECT MEMEORY ADDRESSING
DS register- offset value
Offset value called effective address
Обращение к памяти
Пример
BYTE_TABLE DB 14, 15, 22, 45 ;Tables of bytes
WORLD_TABLE DW 134, 345, 564, 123 ;Tables of words
INDIRECT MEMEORY ADDRESSING
Segment:Offset addressing
Непрямая адрессация памяти. Для этих целей в основном используются основные регистры.
EBX, EBP, BX, BP
Index registers
DI, SI
Непрямая адресация ипользуетсся для переменных, массивов EBX
Пример показывает как получить доступ к переменным
MY_TABLE TIMES 10 DW 0 ;Accolcate (выделить) 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABELE] ;Effective (исполнитель) Address of MY_TABLE in EBX
MOV [EBX], 110 ;MY_TABLE[0] = 110
ADD EBX, 2 ;EBX = EBX + 2
MOV [EBX], 123 ;MY_TABLE[1] = 123
MOV instruction - используется для перемещения данных из одной области хранения в другую.
СИНТАКСИС
MOV destination, source -> местоназначение, источник
Пример
MOV EBX, [MY_TABLE] ;Effective Address of MY_TABLE in EBX
Type Specifier Bytes addressing
BYTE 1
WORD 2
DWORD 4
QWORD 8
TBYTE 10
Пример:
section .text
global _start ;must be declared for linker (Id)
_start: ;tell linker entry point
;writing the name 'Zara Ali'
MOV edx, 9 ;message lenght
MOV ecx, name ;message to write
MOV ebx, 1 ;file descriptor (stdout)
MOV eax, 4 ;system call number (sys_write)
INT 0x80 ;call kernel - вызов ядра
MOV [name], dword 'Nuha' ;Change the name to Nuha Ali
;writing the name 'Nuha Ali'
MOV edx, 8 ;message lenght
MOV ecx, name ;message to write
MOV ebx, 1 ;file descriptor (stdout)
MOV eax, 4 ;system call number (sys_write)
INT 0x80 ;call kernel
MOV eax, 1 ;system call number (sys_exit)
INT 0x80 ;call kernel
section .data
name db 'Zara Ali'
После выполнения данного кода результат будет:
Zara Ali Nuha Ali
ОБЪЯВЛЕНИЕ ПЕРЕМЕННЫХ
Существует пять основных форм деректив переменных
Directive Purpose Storage Space
DB Define Byte allocates 1 byte (allocate - выдеять)
DW Define Word allocates 2 bytes (allocate - выдеять)
DD Define Doube Word allocates 4 bytes (allocate - выдеять)
DQ Define Quardword allocates 8 bytes
DT Define Ten Bytes allocates 10 bytes
- каждый байт храниться в формате ASCII в hex
- каждое десятичиное значение автоматически переводится в 16-ричное
- процессор использует порядок байтов - прямой порядок байтов
- отрицательные числа переводятся в их комплементарное представление
- короткие и длинные числа с плавающей точной представляются в виде 32-битных или 64-битых
Пять основных форм директив
Directive Purpose
RESB Reserve a Byte
RESW Reserve a Word
RESD Reserve a Doubleword
RESQ Reserve a Quardword
REST Reserve a Ten Bytes
CONSTANTS - ОПРЕДЕЛЕНИЕ КОНСТАНТ
- EQU
- %assign
- %define
Директива EQU - метка equ выражение
Директива EQU присваивает метке значение, которое определяется как результат целочисленного выражения в правой части.
Результатом этого выражения может быть целое число, адрес или любая строка символов:
truth equ 1
message1 equ 'Try again$'
var2 equ 4[si]
cmp ax,truth ;cmp ax,1
db message1 ;db 'Try again$'
mov ax,var2 ;mov ax, 4[si]
Директива EQU чаще всего используется с целью введения параметров, общих для всей программы, аналогично команде #define препроцессора языка С.
Директива LABEL метка label тип
Директива LABEL определяет метку и задает ее тип. Тип может быть одним из: BYTE (байт), WORD (слово), DWORD (двойное слово),
FWORD (6 байт), QWORD (учетверенное слово), TBYTE (10 байт), NEAR (ближняя метка), FAR (дальняя метка). Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда
mov метка,0
запишет в память байт (слово, двойное слово и т.д.), заполненный нулями, а команда
call метка
выполнит ближний или дальний вызов подпрограммы.
С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, так и к словам, определив перед данными две метки с разными типами.
Пример
SYS_EXIT equ 1
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
section .text
global _start ;must be declare for using gcc
_start: ;tell linker entry point
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg3
mov edx, len3
int 0x80
mov eax, SYS_EXIT ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg1 db 'Hello, programmers!', 0xA, 0xD
len1 equ $ - msg1
msg2 db 'Welcome to world of', 0xA, 0xD
len2 equ $ - msg2
msg3 db 'Linux assembly programming'
len3 equ $ - msg3
Результат программы
Hello, programmer!
Welcome to the world of,
Linux assembling programming!
%assign ДИРЕКТИВА
Используется для определения числовых констант.
%assign TOTAL 10
%assign TOTAL 20
%define ДИРЕКТИВА
Используются для определения числовых и строчных констант
%define PTR [EBP+4]
АРИФМИТИЧЕКИЕ ИНСТРУКЦИИ
INC incrementing - инкремент
Операнд (destination) место назначения -> 8-bit, 16-bit, 32-bit
INC EBX ;Increments 32-bit registers
INC DL ;Increments 8-bit register
INC [count] ;Increments the count variable
DEC decrement - декремент
Операнд (destination) место назначения -> 8-bit, 16-bit, 32-bit
ADD and SUB Addition and Substitution (Cложение и Вычитание)
LOGICAL INSTRUCTION - ЛОГИЧЕСКИЕ ИНСТРУКЦИИ
BOOLEAN LOGIC
AND
OR
XOR (исключающее имя)
TEST
NOT
УСЛОВНАЯ ИНСТРУКЦИЯ И РАЗВЕТВЛЕНИЕ -> ЦИКЛЫ (loop), разветвления
Эти инструкции могут изменить ход программы
Два сценария условных инструкций
Unconditinal jump - БЕЗУСЛОВНЫЙ ПЕРЕХОД
JMP - безуслоный переход.
Условный переход (исполнение) часто используется для передачи управление на адрес команды, которая ее следует за исполняемой командой. Передача управления может выполнить новый набор инструкций, чтобы венуться к прежним шагам.
Conditional jump - УСЛОВНЫЙ ПЕРЕХОД
Условный переход зависит от условий. Условные инструкции передачи управление.
Условные переходы зависят от условий и данных.
Instruction Descrition Flag
JE/JZ Jump Equal of Jump Zero ZF
JNE/JNZ Jump not Equal of Jump not Zero ZF
JG/JNLE Jump Greater of Jump Not Less/Equal OF, SF, ZF
JGE/JNL Jump Greater of Jump Not Less OF, SF
JL/JNGE Jump Less or Jump Not Greater/Equal OF, SF
JLE/JNG JUmp Less/Equal or Jump Not Greater ZF
Использутся в логических операциях
Instruction Descrition Flag
JE/JZ Jump Equal of Jump Zero ZF
JNE/JNZ Jump not Equal of Jump not Zero ZF
JA/JNBE Jump Above of Jump Not Below/Equal CF, ZF
JAE/JNB Jump Above/Equal of Jump Not Below CF
JB/JNAE Jump Below or Jump Not Above/Equal CF
JBE/JNA JUmp Below/Equal or Jump Not Above AF, CF
Использутся в логических операциях
Instruction Descrition Flag
JXCZ Jump if CX is Zero none
JC Jump if Carry CF
JNC Jump if No Carry CF
JO Jump if Overflow OF
JNO Jump if No Overflow OF
JP/JPE Jump Parity or Jump
Parity Even PF
JNP/JPO Jump No Parity or
Jump Parity Odd PF
JS Jump Sign (negative value) SF
JNS Jump No Sigh (positive value) SF
JMP используется для реализации циклов loop
MOV CL, 10
L1:
<LOOP-BODY>
DEC CL
JNZ L1
ПРИМЕР
section .text
global _start ;must be declare for using gcc
_start: ;tell linker entry point
mov ecx, 10
mov eax, '1'
l1
mov [num], eax
mov eax, 4
mov ebx, 1
push ecx
mov ecx
mov ecx, num
mov edx, 1
int 0x80
mov eax, [num]
sub eax, '0'
inc eax
add eax, '0'
pop ecx
loop l1
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
ASSEMBLY - NUMBERS
Числовые данные представлены в бинарной системы.
Арифмитические инструкции управляют бинарными данными.
Когда числовые данные вводятся на экран или с экрана они представлены в ASCII форме
ПРИМЕР
section .text
global _start ;must be declare for using gcc
_start: ;tell linker entry point
sub ah, ah
mov al, '9'
sub al, '3'
aas
or al, 30h
mov [res], ax
mov edx, len ;message lenght
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number
int 0x80 ;call kernel
mov edx, 1 ;message lenght
mov ecx, res ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number
int 0x80 ;call kernel
mov eax, 1 ;system call number
int 0x80 ;call kernel
МАССИВЫ В АССЕМБЛЕРЕ
- длина строки
- характер массива
Пять основных инструкций для представления массивов
MOVS - эта инструкция перемещает 1 Byte, Word или Doubleword данных из памяти в другое место.
LODS - эта инструкция загружает из памяти. Если операнд составляет один байт (byte), он загражается в AL регистр, если операнд одно слово (word), он загружается в AX регистр и ести двойное слово (doubleword) то загружается в EAX регистр.
STOS - эта инструкция хранить данные из регистров (AL, AX, EAX) в памяти.
CMPS - эта инструкция сравнивает две даты в памяти. Даты могут быть размером byte, word, doubleword
SCAS - эта инструкци сравнивает содержание регистра (AL, AX, EAX) с содержанием данных в памяти
ПРОЦЕДУРЫ - PROCEDURES
Процедуры или подпрограммы (subroutines) очень важные части ассемблера, т.к. программы на ассемлере очень больше.
Процедуры идентифицируются по имени. Следуя имени, тело процедуры описывается тем что она делает. Конец процедуры идентифицирутся - return.
section .text
global _start ;must be declare for using gcc
_start: ;tell linker entry point
mov ecx, '4'
sub ecx, '0'
mov edx, '5'
sub edx, '0'
call sum ;call sum procedure
mov [res], eax
mov ecx, msg
mov edx, len
mov edx, 1 ;file descriptor (stdout)
mov eax, 4 ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx, res
mov edx, 1 ;message lenght
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number
int 0x80 ;call kernel
sum:
mov eax, ecx
add eax,edx
add eax, '0'
section .data
msg db "The sum is:", 0xA, 0xD
len equ $- msg
segment .bss
res resb 1
STACK DATA STRUCTRE - СТЕК -
Сегмент который содержит величины, данные проходящиее через функции и процедуры внутри программы
Две инструкции для операции по СТЕК -> PUSH, POP
PUSH operand
POP address/registers
Правила для СТЕКА
- Только word или doublewords могут храниться в Стеке, но не byte
- Стек растет в обратном порядке к наименьшим адресам памяти
СИСТЕМНЫЕ ВЫЗОВЫ НА АССЕМБЛЕР
sys_brk() system call - задействовано ядро
Комментариев нет:
Отправить комментарий