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

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


При рассмотрении механизма определения адреса для двухмерного массива было замечено, что для определения адреса текущего элемента массива необходимо знать размер одного элемента

и длину строки (или количество элементов в одной строке). Поэтому в списке параметров необходимо обязательно задавать непосредственно длину строки или параметр, который позволит вычислить эту длину.

Пример 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яюыэ хЄё  яю Єхь цх яЁртшырь, ўЄю фы  фтєїьхЁэюую ьрёёштра




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