Передача в списке параметров одномерных массивов
Для одномерных массивов – и исходных данных и результатов – передаются адреса. Это исключает необходимость копирования исходных массивов.
Пример 1. Составить функцию для объединения двух строк и использовать ее для объединения строк, содержащих слова "first " и "second " в одну строку.
IDEAL
P586
MODEL FLAT
Extrn ExitProcess:proc
DATASEG
str1 db 'first ', 0
str2 db 'second', 0
rez db (rez-str1-1) dup (?)
CODESEG
begin:
push offset str1 offset str2 offset rez ; передача адресов массивов
call strcat ;вызов процедуры
call ExitProcess
| proc strcat;
|
| 0
|
| EBP
|
|
| push ebp;
|
| 4
|
| EIP
|
|
| mov ebp, esp;
|
| 8
|
| REZ
|
|
| Push eax ebx ecx;
|
| 12
|
| STR2
|
|
| ; for (I=0; str1[I]; I++) rez[I]=str1[i];
|
| 16
|
| STR1
|
|
| Mov EAX, [EBP+16];
|
|
|
|
|
|
| Mov EBX, [EBP+8];
|
|
|
|
|
|
| For1:
|
|
|
|
|
|
| Mov CL, [EAX]
|
|
|
|
|
|
| Test Cl, cl
|
|
|
|
|
|
| Je break1
|
|
|
|
|
|
| Mov [EBX], cl
Inc eax
Inc ebx
|
|
|
|
|
|
| Jmp For1
Break1:
Mov EAX, [ebp+12]
For2:
|
|
|
|
|
|
| Mov CL, [EAX]
|
|
|
|
|
|
| Mov [EBX], cl
Test Cl, cl
|
|
|
|
|
|
| Je break2
|
|
|
|
|
|
| Inc eax
Inc ebx
Jmp For2
Break2:
|
|
|
|
|
|
Pop ecx ebx eax ebp
Ret 12
Endp
End begin
В этом примере признаком конца исходных данных является нулевой завершитель (символ с кодом 0). В результирующую строку завершитель записывается после копирования второй строки. Для массивов исходных данных (str1, str2) и массива результата (rez) передаются адреса. Это делается для экономии стекового простран-
ства и числа команд, необходимых для передачи параметров.
Пример 2. Составить программу для записи в третий массив тех чисел первого, которых нет во втором.
ideal
p386
model flat
extrn ExitProcess:proc
dataseg
x dd 1,2,3,4,5,6
ALаааааааааааааааааа - Ёхчєы№ЄрЄ - срщЄ
AXаааааааааааааааааа - Ёхчєы№ЄрЄ - ёыютю
EAXаааааааааааааааа - Ёхчєы№ЄрЄ Ц фтющэюх ёыютю
EDX, EAXаааааа - Ёхчєы№ЄрЄ Ц 2 фтющэvї ёыютр
аааа ¦ЁшьхЁ 3.а TюёЄртшЄ№ ЇєэъЎш¦ фы ёЁртэхэш "фышээvї" ўшёхы. LєэъЎш фюыцэр тючтЁр•рЄ№ 0, хёыш ўшёыр ёютярфр¦Є, 1 Ц хёыш яхЁтюх ўшёыю сюы№°х тЄюЁюую ш Ц1 т яЁюЄштэюь ёыєўрх.
ideal
p686
modelаа flat
extrn ExitProcess:proc
dataseg
xааааааааа ddааааааа 1000 dup (0ffffffffh)
nааааааааа ddааааааа (n-x)/4
yааааааааа ddааааааа 1000 dup (0ffffffffh)
resаааааа ddааааааа ?
t1аааааааа ddааааааа ?
t2аааааааа ddааааааа ?
codeseg
begin:
pushаааа [n] offset x offset yаа
rdtsc
movаааа ecx,eax
callааааа m_cmp
movаааа [res], eax
rdtsc
subаааааа eax, ecx
movаааа [t1], eax
pushаааа [n] offset x offset yаа
rdtsc
movаааа ecx,eax
callааааа m_cmp
movаааа [res], eax
rdtsc
subаааааа eax, ecx
movаааа [t1], eax
pushаааа [n] offset x offset yаа
rdtsc
movаааа ecx,eax
callааааа m_cmp1
movаааа [res], eax
rdtsc
subаааа eax,ecx
movаааа [t2], eax
call ExitProcess
;for (i=n-1; i>=0; i--){ааааааааааааааааааааааа ebpааааа 0
;ааа if (x[i]>y[i]) return -1;а ааа eipаааааа 4
;ааа if (x[i]<y[i]) return 1;аа аааа yааааааааа 8
;}ааааааааааааааааааааааааааааа аааааааааааааа xааааааааа 12
;return 0;ааааааааааааааааааааа аааааааааааааааааааааа nааааааааа 16
proc ааа m_cmp
push ebp;
movа ebp,а esp;
Pushа ebx ecx edx
movаааа ecx, [ebp+16]; n
movаааа eax, [ebp+12]; &x
movаааа ebx, [ebp+8] ; &y
fori:
movаааа edx, [eax+ecx*4-4]
cmpаааа edx, [ebx+ecx*4-4]
jbаааааааа short m1; x[i]< y[i]
jaаааааааа short m2; x[i]> y[i]
loopаааа fori
subаааааа eax, eax
m1:
movаааа eax, -1
jmpааааа short m3
m2:
movаааа eax, 1
m3:
popааааа edx ecx ebx ebp
Retаааааа 12
Endp
proc ааа m_cmp1
push ebp;
movа ebp,а esp;
Pushаа ecx esi edi
movаааа ecx, [ebp+16]; n
movаааа esi, [ebp+12]; &x
leaаааааа esi, [esi + ecx*4-4]
movаааа edi, [ebp+8] ; &y
leaаааааа edi, [edi + ecx*4-4]
std
repeаааа cmpsd
jbаааааааа short m11; x[i]< y[i]
jaаааааааа short m12; x[i]> y[i]
subаааааа eax, eax
m11:
movаааа eax, -1
jmpааааа short m13
m12:
movаааа eax, 1
m13:
cld
popааааа edi esi ecx ebp
Retаааааа 12
Endp
end begin
¦рьхЄшь, ўЄю лЎшЇЁv¬ ўшёыр ёЁртэштр¦Єё , эрўшэр ёю ёЄрЁ°хщ ЎшЇЁv. ¦рцфр ЎшЇЁр ёЁртэштрхЄё ъръ схччэръютюх ўшёыю. TЁртэхэшх яЁюфюыцрхЄё фю Єхї яюЁ, яюър эрщфхь Ёрчэvх ЎшЇЁv шыш эх ёЁртэшь тёх ЎшЇЁv ўшёыр.
+сЁрЄшЄх тэшьрэшх эр эютvх ъюьрэфv фы юяЁхфхыхэш ъюышўхёЄтр ЄръЄют фы тvяюыэхэш ЇєэъЎшщ. ¦юьрэфр RDTSC (Read Time-stamp counter) - тvяюыэ хЄё фы яЁюЎхёёюЁют, эрўшэр ё PENTIUM MMX ш тючтЁр•рхЄ т ЁхушёЄЁх EAX
+Єюсv юяЁхфхышЄ№, яюффхЁцштрхЄё ыш фрээр ъюьрэфр фы яЁюЎхёёюЁр, шёяюы№чєхЄё ъюьрэфр CPUIDЧCPU Identification
¦Єр ъюьрэфр Єръцх яючтюы хЄ юяЁхфхышЄ№ яЁюшчтюфшЄхы яЁюЎхёёюЁр, ёхьхщёЄтю, ъюЄюЁюьє юэ яЁшэрфыхцшЄ, ьюфхы ш тхЁёшш, р Єръцх фЁєує¦ шэЇюЁьрЎш¦. -ы юяЁхфхыхэш Єшяр тvфртрхьющ шэЇюЁьрЎшш шёяюы№чєхЄё ЁхушёЄЁ EAX ( Єрсы 11.3). ¦юьрэфр CPUID ьюцхЄ тvяюыэ Є№ё фы ы¦сюую єЁютэ яЁштшыхушщ.
TрсышЎр 11.3
Tїюфэvх фрээvх
|
Tvїюфэvх фрээvх
|
EAX = 0
|
EAX Ц ьръёшьры№эюх чэрўхэшх, ъюЄюЁюх ьюцэю чрфртрЄ№ эр тїюфх (юсvўэю 2)
EBX, EDX, ECX Ц яЁюшчтюфшЄхы№ Ц -ы PENTIUM ёЄЁюър лGenuineIntel¬ ЁрёяЁхфхыхэр Єръ: EBXа ?756e6547h (* "Genu", сєътр G т BL *)
EDXа ?49656e69h (* "ineI", сєътр i т -DL *)
ECXа ?6c65746eh (* "ntel", сєътра n т CL *)
|
EAX = 1
|
EAX Ц тхЁёш яЁюЎхёёюЁр (Єшя, ёхьхщёЄтю, ьюфхы№, step)
EBX - ЁхчхЁт
ECX- ЁхчхЁт
EDX Ц шэЇюЁьрЎш юс юёюсхээюёЄ ї яЁюЎхёёюЁр
|
EAX = 2
|
EAX ЦшэЇюЁьрЎш ю ъ¤°х
EBX -ЦшэЇюЁьрЎш ю ъ¤°х
ECX- ЦшэЇюЁьрЎш ю ъ¤°х
EDX Ц ЦшэЇюЁьрЎш ю ъ¤°х
|
¦рёёьюЄЁшь ёюфхЁцшьюх Єюы№ъю эхъюЄюЁvї сшЄют ЁхушёЄЁр EDX:
23 Ц яюффхЁцштрхЄё MMX Ц Єхїэюыюуш ;
18 Ц яЁюЎхёёюЁ яюффхЁцштрхЄ 96 сшЄэvщ єэшъры№эvщ эюьхЁ яЁюЎхёёюЁр.
4 Ц яюффхЁцштрхЄё ъюьрэфр RDTSC
¦ЁшьхЁ 4. TюёЄртшЄ№ ЇєэъЎш¦, ъюЄюЁр тючтЁр•рхЄ юЄтхЄ 1, хёыш ъюьрэфр RDTSC яюффхЁцштрхЄё ш 0 т яЁюЄштэюь ёыєўрх.
ideal
p686
modelаа flat
extrn ExitProcess:proc
dataseg
resаааааа ddааааааа ?
codeseg
begin:
callааааа IsReadCount
movаааа [res], eax
call ExitProcess
proc ааа IsReadCount
movаааа eax, 1
cpuid
movаааа eax, 1
testаааааа edx, 1 shl 4
jnzааааааа short m1
subаааааа eax, eax
m1:
Retаааааа
Endp
end begin
Все публикации раздела