Ïåðåäà÷à â ñïèñêå ïàðàìåòðîâ ìíîãîìåðíûõ ìàññèâîâ
Ïðè ðàññìîòðåíèè ìåõàíèçìà îïðåäåëåíèÿ àäðåñà äëÿ äâóõìåðíîãî ìàññèâà áûëî çàìå÷åíî, ÷òî äëÿ îïðåäåëåíèÿ àäðåñà òåêóùåãî ýëåìåíòà ìàññèâà íåîáõîäèìî çíàòü ðàçìåð îäíîãî ýëåìåíòà
è äëèíó ñòðîêè (èëè êîëè÷åñòâî ýëåìåíòîâ â îäíîé ñòðîêå). Ïîýòîìó â ñïèñêå ïàðàìåòðîâ íåîáõîäèìî îáÿçàòåëüíî çàäàâàòü íåïîñðåäñòâåííî äëèíó ñòðîêè èëè ïàðàìåòð, êîòîðûé ïîçâîëèò âû÷èñëèòü ýòó äëèíó.
Ïðèìåð 1 . Ñîñòàâèòü ãëàâíóþ ïðîãðàììó è ôóíêöèþ äëÿ óìíîæåíèÿ çàäàííîãî ñòîëáöà ìàòðèöû íà çàäàííîå çíà÷åíèå.
ideal
p686
model flat
extrn ExitProcess:proc
dataseg
matr dd 1, 1, 1, 1
dd 2, 2, 2, 2
dd 3, 3, 3, 3
value dd 4
col dd 1
n dd 4; êîëè÷åñòâî ñòîëáöîâ
m dd 3; êîëè÷åñòâî ñòðîê
codeseg
begin:
push offset matr [n] [m] [value] [col]; ebp 0
call mc_mul; eip 4
call ExitProcess; col 8
proc mc_mul; value 12
push ebp; m 16
mov ebp, esp; n 20
; matr 24
;for(i=0; i<m; i++)
; matr[i][col]*=value;
push eax ebx ecx esi
mov ecx, [ebp+16]
mov esi, [ebp+24]
mov ebx, [ebp+8]; col
lea esi, [esi+ebx*4]; & íà÷àëà
mov ebx, [ebp+20]
shl ebx, 2; Ðàçìåð ñòðîêè
mov edi, [ebp+12]
for1:
mov eax, [esi]
mul edi
mov [esi], eax
add esi, ebx
loop for1
pop esi ecx ebx eax ebp
Ret 5*4
Endp
end begin
Ïðèìåð 2.
Äëÿ çàäàííîãî ìàññèâà ñòðîê îïðåäåëèòü äëèíû ñòðîê
ideal
p686
model flat
extrn ExitProcess:proc
dataseg
s1 db 'a', 0
s2 db 'bb', 0
s3 db 'ccc', 0
s4 db 'dddd', 0
array dd s1, s2, s3, s4
n dd (n-array)/4
lenàààààà ddààààààà 4 dup (?)
codeseg
begin:
push ààà offset array [n] offset lenàààààààà
callààààà TextLen
call ExitProcess;
proc ààà TextLen;àà
pushàààà ebp
movàààà ebp, esp;ààààààààààààààààààààààààààààààààà TT+¦
;for (i=0; i<n; i++ ){ààààààààààààààààààààààààà ebpààààà 0
;àà for (j=0; array[i][j]; j++);àààà ààààààà eipàààààà 4
;àà len[i]=j;àààààààààààààààààààààààààà àààààààààààààà lenàààààà 8
;}ààààààààààààààààààààààààààààààààààààà àààààààààààààààààà nààààààààà 12
;àààààààààààààààààààààààààààààààààààààà ààààààààààààààààààà arrayàà 16
pushad
movàààà ecx, [ebp+12]
movàààà eax, [ebp+16]
movàààà edi, [ebp+8]
fori:
subàààààà edx, edx
leaàààààà ebx, [eax+ecx*4-4]
movàààà esi, [ebx]
forj:
movàààà bl, [esi+edx]
testàààààà bl, bl
jeàààààààà short breakj
incàààààà edx
jmp àààà forj
breakj:
movàààà [edi+ecx*4-4], edx
loopàààà fori
popad
popààààà ebp
Retàààààà 3*4ààààà
Endp
end begin
+ñ¨ðªøªõ òýøüðýøõ ýð ¨ðñþªº ¸ ðô¨õ¸þü üð¸¸øòð ðô¨õ¸þò!
¦¨øüõ¨ 3. Lÿþ¨ ôþ¢øª¹ üð¸¸øò ¸ª¨þú ò ÿþ¨ ôúõ ºñvòðýø ôûøý ¸ª¨þú.
ideal
p686
modelàà flat
extrn ExitProcess:proc
dataseg
s1àààààààà dbààààààà 'a', 0
s2àààààààà dbààààààà 'bb', 0
s3àààààààà dbààààààà 'ccc', 0
s4àààààààà dbààààààà 'dddd', 0
arrayàà ddààààààà s1, s2, s3, s4
n àààààààà ddààààààà (n-array)/4
lenàààààà ddààààààà 4 dup (?)
codeseg
begin:
push ààà offset array [n] offset lenàààààààà
callààààà TextLen
push ààà offset array [n] offset len
callààààà SortLenààààààààààà
call ExitProcess;
proc ààà TextLen;àà
pushàààà ebp;ààààààààààààààààààààààààààààààààààà
movàààà ebp, esp;ààààààààààààààààààààààààààà ààà
;for (i=0; i<n; i++ ){ààààààààààààààààààààààààà ebpààààà 0
;àà for (j=0; array[i][j]; j++);ààààààà eipààààààààààà 4
;àà len[i]=j;àààààààààààààààààààààààààà lenààààààààà 8
;}ààààààààààààààààààààààààààààààààààààà nàààà 12
;àààààààààààààààààààààààààààààààààààààà arrayàààààààààà 16
pushad
movàààà ecx, [ebp+12]
movàààà eax, [ebp+16]
movàààà edi, [ebp+8]
fori:
subàààààà edx, edx
leaàààààà ebx, [eax+ecx*4-4]
movàààà esi, [ebx]
forj:
movàààà bl, [esi+edx]
testàààààà bl, bl
jeàààààààà short breakj
incàààààà edx
jmp àààà forj
breakj:
movàààà [edi+ecx*4-4], edx
loopàààà fori
popad
popààààà ebp
Retàààààà 3*4ààààà
Endp
proc SortLen
pushàààà ebp
movàààà ebp, esp
pushad
;for (i=1; i<n; i++){àààààààààààààààààààààààààààààààààààààà ebpààààà 0
;àà r=x[i];àààààààààààààààààààààààààààààààààààà àààààààààààààààààààààààààààààà eipàààààà 4
;àà for (j=i-1; j>=0; j--)àààààààààààààààààààààààààààààààààààààààààààààà arrayàà 8ààààààààà
;àààààààààà if (x[j]<r)x[j+1]=x[j]; else break;àààà ààààààààààà nààààààààà 12àààà
;àà x[j+1]=r;àààààààààààààààààààààààààààààààààà àààààààààààààààààààààààààààà lenàààà 16
;}
movàààà eax, 1; i
movàààà ebx, [ebp+8]; array
movàààà edx, [ebp+16]; len
@@fori:
pushàààà ebp
movàààà esi, [ebx+eax*4]; r1
movàààà edi, [edx+eax*4]; r2
movàààà ecx, eax; j
@@forj:
decàààààà ecx
jsààààààààà short @@breakj
cmpàààà [edx+ecx*4], edi
jaeàààààà short @@breakj
movàààà ebp, [edx+ecx*4]
movàààà [edx+ecx*4+4], ebp
movàààà ebp, [ebx+ecx*4]
movàààà [ebx+ecx*4+4], ebp
jmp @@forj
@@breakj:
movàààà [ebx+ecx*4+4], esi
movàààà [edx+ecx*4+4], edi
popààààà ebp
incàààààà eax
cmpàààà eax, [ebp+12]
jbeàààààà @@foriààà àààààà ààà
popad
popààààà ebp
retààààààà 12
endp
end begin
+ñ¨ðªøªõ òýøüðýøõ ýð ø¸ÿþû¹÷þòðýøõ üõªþú òøôð @@øü . ¦ªþ ªðú ýð÷vòðõüvõ ûþúðû¹ývõ üõªúø, þýø ø¸ÿþû¹÷º¦ª¸ ôû þó¨ðýø¢õýø þñûð¸ªø ôõù¸ªòø üõªþú. +ñû𸪹 ôõù¸ªòø üõªúø Ö ¯ºýú¡ø øûø þñû𸪹 üõöôº ôòºü þñv¢ývüø üõªúðüø.
¦¨ø ¸þ¨ªø¨þòúõ üõý ¦ª¸ üõ¸ªðüø ýõ ¸ðüø ¸ª¨þúø, ð ø¿ ðô¨õ¸ð ø ôûøýv. ¦ªþ üþöõª ñvª¹ ÷ýð¢øªõû¹ýþ ¤¯¯õúªøòýõù þñüõýð üõ¸ªðüø ¸ª¨þú, õ¸ûø þýø ôûøýývõ.
à
Tðú úðú ÿ¨øý¡øÿv ¨ðñþªv ¸ ôòº¿üõ¨ývüø ø üýþóþüõ¨ývüø üð¸¸øòðüø þôøýðúþòv, ¸þ¸ªðòûõýøõ ¯ºýú¡øù ôû üýþóþüõ¨ýv¿ üð¸¸øòþò òvÿþûý õª¸ ÿþ ªõü öõ ÿ¨ðòøûðü, ¢ªþ ôû ôòº¿üõ¨ýþóþ üð¸¸øòðà