Мониторинг обменных курсов валют
18c0693f

Передача в списке параметров одномерных массивов


Для одномерных массивов – и исходных данных и результатов – передаются адреса. Это исключает необходимость копирования исходных массивов.

    

Пример 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



Все публикации раздела



Самый выгодный курс обмена валюты