Nov 13, 2013

Программирование на языке ассемблера NASM для ОС Unix - Столяров А.М.

http://www.stolyarov.info/books/asm_unix

Кольца защиты процессора

nasm -f elf hello.asm
ld -m elf_i386 hello.o -o hello
./hello
%include "stud_io.inc"
global _start


section .data
string resb 20
count  resw 256
x      resd 1
fibon  dw 1, 1, 2, 3, 5, 8, 13, 21
msg    db "Hello World"

section .bss
set512 resd 16

section .text
_start: mov  eax, 0
        mov  eax, ebx
        mov  eax, [count]  ; значение count в eax
        mov  eax, count    ; адрес count в eax
        mov  eax, [ebx]    ; из ячейки памяти с адресом ebx

; Арифметика
        add edx, 12
        sub [x], ecx
        inc eax
        dec eax

; Безусловные переходы
        jmp some_label
        jmp eax
        jmp [eax]
        jmp short some_label

; Условные переходы        
some_label: cmp eax, 5
            je equal_label
            jl less_label
            jng not_greater_label
            jnz some_label

; Циклы
        mov ecx, 100
        mov esi, array
        mov eax, 0
lp:     add eax, [esi]
        add esi, 4
        loop lp  

; Побитовые xor, or, and
        xor eax, eax

; Операции сдвига shr (shift right), shl (shift left)
        shr edx, 5
Стек используется при вызовах подпрограмм для хранения адресов возврата, для передачи фактических параметров в подпрограммы и для хранения локальных переменных
        push eax
        pop eax

        pushad ; push all doublewords
        popad  ; для всех регистров: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI

        pushfd ; для регистра флагов EFLAGS
        popfd
Подпрограммы
; fill memory (edi=address, ecx=length, al=value)
fill_memory:
        jecxz fm_q
fm_lp:  mov   [edi], al
        inc edi
        loop fm_lp
fm_q:   ret

; Использование
        mov edi, my_array
        mov ecx, 256
        mov al, '@'
        call fill_memory

        push ebp
        mov ebp, esp
        mov esp, 16 ; 16 - объем памяти под локальные переменные

; после подпрограммы
        mov esp, ebp
        pop ebp
        ret

Макросы
%macro pcall1 2 ; 2 кол-во параметров
        push %2
        call %1
        add esp, 4
%endmacro

; вызов
pcall1 proc, eax


%define arg1 ebp+8

; вызов
        mov eax, [arg1]


%ifdef DEBUG_PRINT
        PRINT "Entering"
%endif
Макросимвол можно определить как ключ коммандной строки
nasm -f elf -dDEBUG_PRINT hello.asm
Операционная система
Аппаратная поддержка мультизадачности:
  • аппарат прерываний
  • защита памяти
  • привилегированный и ограниченный режим работы центрального процессора
  • таймер

        int 80h ; Прерывание
Последовательность:
  • Запрос прерывания
  • Процессор доводит выполнение текущ программы до точки в кот можно прервать. На шине выставляет подтверждене прерывания. Др. прерывания блокируются
  • Устройство передает число идентифицирующие данное устройство - номер прерывания
  • Процессор сохраняет в стеке активной задачи счетчик комманд и регистр флагов
  • Устанавливается привилег. режим центр. процессора. Управление передается на точку входа обработчика прерываний (процедуры операционной системы). Адрес процедуры в спец. области памяти

No comments: