Программирование на Ассемблере

Обращение к полям структуры


Для обращения к полю по имени структуры используется запись вида:

Имя структуры. Имя поля.

Если адрес структуры задан в регистре, то поле структуры задается в виде [(Имя структуры 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

Содержание раздела