Professional Documents
Culture Documents
05 Стрингови,стек
05 Стрингови,стек
05 Стрингови,стек
Аудиториски вежби 5
Стрингови
Стринг е колекција од објекти кои се зачувани на
последователни мемориски локации
Стринговите се низи од
Бајти (B)
Зборови (W)
Со максимална должина од 64KB
Динамички алоцирани
Низа од знаци
Со променлива должина
Штедат меморија
Типови стрингови
Дефинирање на стринг
Стринг кој завршува со знакот $
HelloStr db ”HELLO$”
Типови стрингови
Стринг во асемблер е определен со:
Сегмент во кој е сместен стрингот
Покажувач кон почетокот на стрингот
Индикатор за должината на стрингот
Бројач кој што ја содржи должината од почетокот од стрингот
Знак $ со кој се одредува крајот на стрингот
Покажувач е SI
Поместување од DS до почетокот на стрингот
Покажувач е DI
Поместување од ES до почетокот на стрингот
• 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
• Забелешка
• Инструкцијата LODS не се користи за
повторување
• Вредностите од стрингот се запишуваат во акумулаторот и се
пребришуваат
Примери за повторување
MOV CX, 12 ;се поставува должина на стринг
REPE CMPSB ;повторувај споредба додека ZF=1
JB str1smaller
JA str2smaller
;стринговите се исти
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
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
Асемблер C