05 Стрингови,стек

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 38

Стрингови и стек

Аудиториски вежби 5
Стрингови
 Стринг е колекција од објекти кои се зачувани на
последователни мемориски локации
 Стринговите се низи од
 Бајти (B)
 Зборови (W)
 Со максимална должина од 64KB

 Микропроцесорот 80x86 поддржува неколку


специјални инструкции за манипулација со
стрингови
Типови стрингови
• Статички алоцирани
 Низа од знаци
 Низа со фиксна должина
 Однапред дефинирана статичка должина
 Должината е од 0 до максималната

 Динамички алоцирани
 Низа од знаци
 Со променлива должина
 Штедат меморија
Типови стрингови
 Дефинирање на стринг
 Стринг кој завршува со знакот $

HelloStr db ”HELLO$”
Типови стрингови
 Стринг во асемблер е определен со:
 Сегмент во кој е сместен стрингот
 Покажувач кон почетокот на стрингот
 Индикатор за должината на стрингот
 Бројач кој што ја содржи должината од почетокот од стрингот
 Знак $ со кој се одредува крајот на стрингот

 За полесна манипулација со стрингови во асемблер


постојат таканаречени
 изворен стринг и
 дестинациски стринг
Типови стрингови
 Изворен стринг е определен со:

 Секогаш е сместен во DATA SEGMENT

 Покажувач е SI
 Поместување од DS до почетокот на стрингот

 Бројач кој што ја содржи должината


 Вредноста во CX регистарот
Типови стрингови
 Дестинацискиот стринг е определен со:

 Секогаш е сместен во EXTRA SEGMENT

 Покажувач е DI
 Поместување од ES до почетокот на стрингот

 Бројач кој што ја содржи должината


 Вредноста во CX регистарот
Инструкции за стрингови
• Немаат експлицитни операнди
• Операндите се предефинирани и тоа:
- SI (source index) регистар
- DI (destination index) регистар
- СХ (count) регистар
- AX (accumulator) регистар (или само AL)
- знаменцето за насока (direction flag) од FLAGS регистарот
- Ако е 1, покажувачите ја намалуваат вредноста
- инструкција STD за поставување 1 (Set Direction)
- Ако е 0, покажувачите ја зголемуваат вредноста
- инструкција CLD за поставување 0 (Clear Direction)
Инструкции за стрингови
• Постојат 5 основни инструкции:
- MOVS (Move string)
- LODS (Load string)
- STOS (Store string)

- SCAS (Scan string)


- CMPS (Compare string)
Инструкции за стрингови
• MOVS:
- Се копира елемент стринг (бајт или збор) од локација DS:SI на
локација ES:DI
- По копирањето, се зголемуваат / намалуваат и SI и DI (за еден
или два - бајти), зависно од знаменцето

• 2 форми:
- MOVSB преместува 1 бајт од стринг (SI->DI)
- MOVSW преместува 1 збор од стринг (SI->DI)
Инструкции за стрингови
MOVS{b,w}:
ES:[DI] := ds:[SI]
if direction_flag = 0 then
SI := SI + size;
DI := DI + size;
else
SI := SI - size;
DI := DI - size;
endif;
 Вредноста на size e:
 1, во случај на бајт
 2, во случај на збор
Инструкции за стрингови
• CMPS:
- Споредува два стрингови (споредува бајт/збор од локација
DS:SI со бајт/збор од локација ES:DI) и соодветно ги поставува
знаменцата
- По споредувањето, се зголемуваат/намалуваат и SI и DI (за
еден или два - бајти), зависно од знаменцето за насока

• 2 форми:
- CMPSB споредува 1 бајт од стринг (SI ? DI)
- CMPSW споредува 1 збор од стринг (SI ? DI)
Инструкции за стрингови
CMPS{b,w}:
cmp DS:[SI], ES:[DI]
if direction_flag = 0 then
SI := SI + size;
DI := DI + size;
else
SI := SI - size;
DI := DI - size;
endif;
 Вредноста на size e:
 1, во случај на бајт
 2, во случај на збор
Инструкции за стрингови
• SCAS:
- Споредува (бајт или збор) од акумулаторот (AL, AX) со ES:DI и
соодветно ги поставува знаменцата
- По споредувањето, се зголемува / намалува DI (за еден или два
- бајти), зависно од знаменцето за насока

• 2 форми:
- SCASB споредува 1 бајт од стринг (AL ? DI)
- SCASW споредува 1 збор од стринг (AX ? DI)
Инструкции за стрингови
SCAS{b,w}:
cmp AX / AL, ES:[DI]
if direction_flag = 0 then
DI := DI + size;
else
DI := DI - size;
endif;
 Вредноста на size e:
 1, во случај на бајт
 2, во случај на збор
Инструкции за стрингови
• STOS:
- Копира (бајт или збор) од акумулаторот (AL, AX) на адреса
ES:DI
- По, копирањето се зголемува / намалува DI (за еден или два -
бајти), зависно од знаменцето

• 2 форми:
- STOSB запишува 1 бајт од стринг (AL -> ES:[DI])
- STOSW запишува 1 збор од стринг (AX -> ES:[DI])
Инструкции за стрингови
STOS{b,w}:
ES:[DI] := AX / AL
if direction_flag = 0 then
DI := DI + size;
else
DI := DI - size;
endif;
 Вредноста на size e:
 1, во случај на бајт
 2, во случај на збор
Инструкции за стрингови
• LODS:
- Вчитува (бајт или збор) од адреса DS:SI и запишува во
акумулаторот (AL, AX)
- По копирањето, се зголемува / намалува SI (за еден или два -
бајти), зависно од знаменцето за насока

• 2 форми:
- LODSB вчитува 1 бајт од стринг (SI -> AL)
- LODSW вчитува 1 збор од стринг (SI -> AX)
Инструкции за стрингови
LODS{b,w}:
AX / AL := DS:[SI]
if direction_flag = 0 then
SI := SI + size;
else
SI := SI - size;
endif;
 Вредноста на size e:
 1, во случај на бајт
 2, во случај на збор
Префикси за повторување
• Повторување во зависност од вредноста
на регистарот CX
• Се користат префикси пред
инструкциите за стрингови
- REP
- REPE
- REPZ
- REPNE
- REPNZ
Префикси за повторување
• REP инструкција_за_стринг
• Се повторува инструкцијата CX пати
• REPZ инструкција_за_стринг
• REPE инструкција_за_стринг
• Се повторува инструкцијата додека ZF =1, но најмногу CX пати
• REPNZ инструкција_за_стринг
• REPNE инструкција_за_стринг
• Се повторува инструкцијата додека ZF =0, но најмногу CX пати


Примери за копирање
• Копирање од еден во друг стринг:
 Се повторува CX пати
REP MOVSB

• Се иницијализира дестинацискиот стринг така што


сите знаци се исти со акумулаторот
 Се повторува CX пати
REP STOSB

• Забелешка
• Инструкцијата LODS не се користи за
повторување
• Вредностите од стрингот се запишуваат во акумулаторот и се
пребришуваат
Примери за повторување
MOV CX, 12 ;се поставува должина на стринг
REPE CMPSB ;повторувај споредба додека ZF=1
JB str1smaller
JA str2smaller
;стринговите се исти

• Проверка дали изворниот и дестинацискиот стринг се


исти
• Инструкцијата CMPS ќе се повторува додека ZF=1 најмногу
CX пати
• Повторувањето ќе прекине
• кога ќе се најде првото појавување на букви во
стринговите на иста позиција кои се различни или
• ако читањето на стрингот заврши и CX е 0
• Стринговите се исти
Префикси за повторување
MOV CX, 12 ;должина на стринг
MOV BL, 0 ;број на исти знаци
Again:
JCXZ Done ;ако е до крај, а последната буква е иста
REPNE SCASB ;додека АL со буква од стрингот се различни
JNE Done ;ако е до крај, а последната буква не е иста
INC BL
JMP Again
Done: ...

• Се брои бројот на знаци во дестинацискиот стринг кои се исти


со вредноста во акумулаторот
• Со повторувачката наредба се повторува SCAS додека ZF=0
најмногу CX пати
• Наредбата ќе прекине ако се наиде на буква иста со
акумулаторот
• Ова треба да се повторува додека да се изминат сите букви
од стрингот
Печатење стрингови на екран
 Се дефинира стринг во податочен сегмент
 При печатење на екран стрингот мора да завршува
со знакот $
 Печатењето се изведува со прекин 21h
 Во AH треба да е вредноста 9
 Во DX треба да е поместувањето на првиот знак во
стрингот

lea dx, pkey


mov ah, 9
int 21h ; се печати стрингот од
локација DS:DX до појавување на $
Примена на стек
 Инструкции
 Ставање на стек
 Push mem/reg/const
 Намали го SP , па стави ја вредноста на SS:SP
 Вадење од стек
 Pop mem/reg
 Стави ја вредноста од SS:SP во mem/reg , па зголеми го SP
Примена на стек
 Бројот на регистри кои може да ги користиме е
ограничен, па ако ни е потребен регистер кога сите
се зафатени тогаш можеме вредноста на некој
регистер привремено да ја зачуваме на стек
 Стави ја вредноста од регистерот на стек
 Регистерот се користи за други цели
 Врати ја вредноста од стекот во регистерот

MOV AX, 1234h


PUSH AX ;стави ја стек вредноста од AX
MOV AX, 5678h
POP AX ;врати ја првичната вредност
Примена на стек
 Замена на вредностите на два регистри

MOV AX, 1212h


MOV BX, 3434h

;се ставаат на стек


PUSH AX
PUSH BX

;се вадат во ист редослед


POP AX
POP BX
Процедури
 Примена на стекот за предавање и добивање на
вредности од процедура
 Пред повикот на процедурата на стек може да се ставаат
вредностите кои треба да се предадат на процедурата
 Внимание: Во процедурата, кога таа е повикана, на стекот е веќе
ставена ефективната адреса на следната инструкција по
повикот на процедурата.
 Оваа вредност се вади од стекот и привремено се чува на друга локација
 Од стекот се вадат вредностите кои се предадени на процедурата
 На стекот може да се стават вредностите кои ќе ги добие
процедурата, а на крај да се врати на стекот ефективната адреса
на следната инструкција по повикот на процедурата.
Пример

C++ Асемблер
int square(int x) Square PROC
{ POP BX
int pom; POP AX
pom=x*x;
return pom; MOV CL,AL
} MUL CL ; AX = AL * CL.

PUSH AX
PUSH BX
RET
Square ENDP
Пример
code segment
; процедурата пресметува квадрат на број кој
се предава преку стек на процедурата.
Резултатот во процедурата се става на стек
Square PROC
POP BX ;во BX адресата на следната
инструкција по повикот
POP AX ;во AL се наоѓа вредноста за
Бројот кој е предаден на функцијата Ефективната
адреса на pop,cx
MOV CL,AL
MUL CL ; AX = AL * CL. Резултатот
PUSH AX ;резултатот се става на стек
PUSH BX ; адресата на следната
инструкција се става на стек
RET ; се враќа текот на програмата по
повикот
Square ENDP
Пример
start:
MOV CL,2
MOV CH,0

PUSH CX ;бројот за кој ќе се бара


квадрат е во CL
;стекот е од dw, па CX Се става на стек
Ефективна
CALL Square
адреса на pop,cx
POP CX ;решението од процедурата се
наоѓа во CX Вредноста
предадена на
;колкава е вредноста на BX, дали е сменета
функцијата
во повикот?

МОV ax, 4c00h ;крај на програмата


INT 21h
ends
end start
Пример - подобрување

C++ Асемблер
int square(int x) Square PROC
{ POP BX
int pom; POP AX
pom=x*x; PUSH CX ; меморирај претходна вредност
return pom;
} MOV CL,AL
MUL CL ; AX = AL * CL.

POP CX
PUSH AX
PUSH BX
RET
Square ENDP
Што прави следниот код?
start:
MOV CL,2
code segment MOV CH,0
Square PROC MOV BX,5
POP BX stepen:
POP AX PUSH CX
MOV CL,AL CALL Square
MUL CL ; AX = AL * BL POP CX
PUSHF ;на стек се става POPF ;од стек се вади
регистерот со знаменца регистерот со знаменца
PUSH AX jno stepen
PUSH BX
RET MOV ax, 4c00h
Square ENDP INT 21h
ends
end start
Процедури
 BP (Base pointer register)
 [BP+disp] – Регистерски-индиректен со поместување
 [BP+SI] – Базен и индексен режим
 [BP+DI+disp] - Базен и индексен режим со поместување
 Пристап до SS

[BP+2] соодветствува на SS: (BP+2)


Процедури
 Во процедурата ќе го користиме BP да покажува на вредностите
предадени на процедурата (value 1 и value 2)
 PUSH BP
 MOV BP,SP
 Пред крајот на процедурата: POP BP

BP (prev. value) BP BP (prev. value)


Ефективна Ефективна
адреса на првата BP+2 адреса на првата
инструкција по инструкција по
повикот повикот
BP+4 Value 1
Value 1
Value 2
Value 2 BP+6
Процедури

Асемблер C

addp proc int addp(int a, int b)


push bp {
mov bp, sp return a + b;
mov ax,[bp+4] }
add ax,[bp+6]
pop bp
ret
addp endp
Процедури
Аргументите на процедурата се предаваат преку стек, а регултатот е во AX
Асемблер C

mov ax,2 Total=add(1, 2)


push ax
mov ax,1
push ax
call addp
add sp,4 ;има 2 аргументи
mov total,ax ;резултатот е
во AX

You might also like