Обращение к полям структуры
Для обращения к полю по имени структуры используется запись вида:
Имя структуры. Имя поля.
Если адрес структуры задан в регистре, то поле структуры задается в виде [(Имя структуры reg). Имя поля].
Пример. Задан массив с возрастами. Определить возраст самого старшего человека списка
ideal
p386
model flat
extrn ExitProcess:proc
dataseg
STRUC AGE
day db 1
month db 1
year dw 1980
ends
list AGE < 3,10>, <1,1,1993>
AGE < 1,1, 1989>, <>
count dd 4
old AGE ?
codeseg
begin:
mov eax, offset list
mov bx, [(AGE eax).year]
mov dl, [(AGE eax).month]
mov dh, [(AGE eax).day]
mov ecx, [count]
dec ecx
add eax, 4
for1:
cmp bx, [(AGE eax).year]
jl short next
jg write
cmp dl, [(AGE eax).month]
jl short next
jg short write
cmp dh, [(AGE eax).day]
jle short next
write:
mov bx, [(AGE eax).year]
mov dl, [(AGE eax).month]
mov dh, [(AGE eax).day]
next:
add eax, 4
loop for1
mov [old.year], bx
mov [old.month], dl
mov [old.day], dh
call ExitProcess
end begin
Вариант 2.
Использовать для сравнения целиком всю запись.
ideal
p386
model flat
extrn ExitProcess:proc
dataseg
STRUC AGE
day db 1
month db 1
year dw 1980
ends
list AGE < 3,10>, <1,1,1993>, < 1,1, 1989>, <>
count dd 4
old AGE ?
codeseg
begin:
mov eax, offset list
mov ebx, [ eax]
mov ecx, [count]
dec ecx
for1:
add eax, 4
cmp ebx, [ eax]
jle short next
write:
mov ebx, [ eax]
next:
loop for1
mov [dword old], ebx
call ExitProcess
end begin
Пример 2. Составить программу для упорядочивания списка студентов в порядке убывания среднего балла
Способ 1. В запись включить фамилию и оценки - недостаток - размер фамилии может содержать разное число символов - надо выделять память по максимуму.
Способ 2. Записать список фамилий. Адрес каждой фамилии -в запись. Достоинства:
памяти, сколько требуется;
при сортировке перемещается не строка, а ее адрес - уменьшается требуемое время.
Lёяюы№чєхь фы єяюЁ фюўштрэш ьхЄюф яюфёўхЄр .
TєЄ№ ьхЄюфр: -ы ърцфюую ўшёыр юяЁхфхы хь ъюышўхёЄтю ўшёхы, яЁхф°хёЄтє¦•шї фрээюьє ўшёыє. ¦рЄхь ўшёыр ёЄрт Єё эр ётюш ьхёЄр т фЁєуюь ьрёёштх.
; +яЁхфхыхэшх ъюышўхёЄтр яЁхф°хёЄтє¦•шї ўшёхы
аfor (i=0; i<n; i++) s[i]=0;
for (i=1; i<n; i++)
аа for (j=0; j<i; j++)
ааааа if (x[j]>x[i]) s[j]+=1; else s[i]+=1;
; ¦ряшё№ ўшёхы эр ётюш ьхёЄр
for (i=0; i<n;i++)
аа y[s[i]]=x[i];
ideal
p386
modelаа flat
extrn ExitProcess:proc
dataseg
fio1ааа dbааааа 'aaaaaaaa', 0
fio2ааа dbааааа 'bbbbbb', 0
fio3ааа dbааааа 'cccccccccccccccc', 0
fio4ааа dbааааа 'ddddddd', 0
fio5ааа dbааааа 'eeeeeeeeeeeeeeeeeeee', 0
struc аа data1
pfioаааааа ddаа ?
oc1ааааааа dbаа ?
oc2ааааааа dbаа ?
oc3ааааааа dbаа ?
oc4ааааааа dbаа ?
ends
gr1ааааааа data1а < offset fio1, 2, 3, 4, 5>, < offset fio2, 3,4,5,3>
аааааааааа data1а < offset fio3, 5, 5, 5, 5>, < offset fio4, 5,4,5,5>
аааааааааа data1а < offset fio5, 5, 4, 4, 4>
countааааа ddааа 5
rааааааааа data1 5 dup (?)
sааааааааа ddаа 5 dup(0)
codeseg
begin:
;for (i=1; i<n; i++)
movа ecx, [count]
decа ecx
movаааа eax, 1
movа esi, offset gr1
addааааа esi, 8
fori:
movа bl,0
addа bl, [(data1 esi).oc1]
addа bl, [(data1 esi).oc2]
addа bl, [(data1 esi).oc3]
addа bl, [(data1 esi).oc4]
;аа for (j=0; j<i; j++)
movаааа edx, 0
movаааа edi,offset gr1
forj:
cmpаааа edx, eax
jgeаааа breakj
movаааа bh, 0
addаааа bh, [(data1 edi).oc1]
addаааа bh, [(data1 edi).oc2]
addаааа bh, [(data1 edi).oc1]
addаааа bh, [(data1 edi).oc1]
;ааааа if (x[j]>x[i]) s[j]+=1; else s[i]+=1;
cmpааа bh, bl
jgeааа short mge
incааа [s+edx*4]
jmpааа short nextj
mge:
incааа [s+eax*4]
nextj:
incааа edx
addааааа edi, 8
jmpаа forj
;i++
breakj:
incа eax
addааааа esi, 8
loopаааа fori
;for (i=0; i<n;i++)
movа ecx, [count]
movа eax, 0
for2:
;аа y[s[i]]=x[i];
leaаааааа esi, [ gr1 + eax* 8]
movа ebx, [s+eax*4]
leaаааааа edi, [r+ebx*8]
movа edx, [(data1 esi).pfio]
movа [(data1 edi).pfio], edx
movа edx, [dwordа (data1 esi).oc1]
movа [dword (data1 edi).oc1], edx
;i++
incа eax
loopаа for2
call ExitProcess
end begin