Ïðîãðàììèðîâàíèå íà Àññåìáëåðå


Ïåðåäà÷à â ñïèñêå ïàðàìåòðîâ ìíîãîìåðíûõ ìàññèâîâ


Ïðè ðàññìîòðåíèè ìåõàíèçìà îïðåäåëåíèÿ àäðåñà äëÿ äâóõìåðíîãî ìàññèâà áûëî çàìå÷åíî, ÷òî äëÿ îïðåäåëåíèÿ àäðåñà òåêóùåãî ýëåìåíòà ìàññèâà íåîáõîäèìî çíàòü ðàçìåð îäíîãî ýëåìåíòà

è äëèíó ñòðîêè (èëè êîëè÷åñòâî ýëåìåíòîâ â îäíîé ñòðîêå). Ïîýòîìó â ñïèñêå ïàðàìåòðîâ íåîáõîäèìî îáÿçàòåëüíî çàäàâàòü íåïîñðåäñòâåííî äëèíó ñòðîêè èëè ïàðàìåòð, êîòîðûé ïîçâîëèò âû÷èñëèòü ýòó äëèíó.

Ïðèìåð 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ÿþûý õª¸  ÿþ ªõü öõ ÿ¨ðòøûðü, ¢ªþ ôû  ôòº¿üõ¨ýþóþ üð¸¸øòðà

Ñîäåðæàíèå ðàçäåëà