Инициализация структуры - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, пишу программу на ассемблере в которой пытаюсь инициализировать структуру, но TASM выдаёт ошибку Illegal override in structure. Вроде объявляю и инициализирую, как в лекциях и в учебном примере, причём пример ассемблирует, а у меня ошибку выдаёт. Не могу понять почему, в коде, конечно ещё много чего не доделано до конца (или до ума), но мне инициализация структуры не даёт покоя.
INCLUDE C:\IOASM.asm
;Данны сведения о площади территории и численности населения разных стран:
;   название страны (10 символов)
;   название континента (7 символов)
;   площадь территории (тыс. кв. км)
;   количество жителей (тыс. чел.)
;Сформировать упорядоченный по заданному признаку список N стран
;имеющих наибольшую плотность населения
;В список включить название страны, площадь и количество жителей.
;Подсчитать суммарное число жителей в отоборанных странах указанного типа
;=============================================================================
.model small
;Формат исходной таблицы (ИТ)
tabl1 struc
    country db 10 dup(' ')      ;название страны
    continent db 7 dup(' ')     ;название континента    
    area dw ?       ;площадь
    people dw ?     ;население
tabl1 ends
;Формат результирующей таблицы (РТ)
tabl2 struc
    country2 db 10 dup (' ')    ;название страны
    area2 dw ?      ;площадь
    people2 dw ?    ;население
tabl2 ends
;-------------------------------------------
;Макрос подсчёта популяции
POPULATION MACRO
push cx
push ax
mov cx,N
 
next:
mov ax, itabl[cx].area
mov dx,0
div itabl[cx].people
mov populat[cx],al
loop next
 
pop ax
pop cx
endm
.stack 256
;-------------------------------------------
.data
N equ 9 ;количество элементов исходной таблицы
lens equ type tabl1     ;длина записи ИТ
lenr equ type tabl2     ;длина записи РТ
populat db 9 dup (?)
;Определение и инициализация ИТ
itabl   tabl1 <'Россия','Евразия',23716,2235>
        tabl1 <'Индия','Азия',14555,5622>
        tabl1 <'Германия','Европа',548,856>
        tabl1 <'Китай','Азия',10438,8430>
        tabl1 <'США','ЮА',20048,3987>
        tabl1 <'Франция','Европа',458,657>
        tabl1 <'Египет','Африка',1230,2058>
        tabl1 <'Канада','СА',15745,1856>
        tabl1 <'КНДР','Азия',985,875>
rtabl tabl2 N dup (<>)  ;РТ
;-------------------------------------------
.code
;-------------------------------------------
;процедура сортировки вставками
sort proc
;сначала скопируем существующий массив (N элементов)
pop cx
lea dx,itabl.country[0]
lea bx,rtabl.country2[0]
 
copyJ:
lea si,itabl.country[dx]
lea di,rtabl.country2[bx]
mov cx,type itabl.country
;копируем строку страна
mov cx,ax   ;копируем в cx значение введённое с клавиатуры
rep movsw   ;копируем элементы массива
add dx,lens
add bx,lenr
loop copyJ
 
push cx
 
;копируем строку площадь
lea si,itabl.area
lea di,rtabl.area2
mov cx,ax   ;копируем в cx значение введённое с клавиатуры
rep movsw   ;копируем элементы массива
;копируем строку количество жителей
lea si,itabl.people
lea di,rtabl.people2
mov cx,ax   ;копируем в cx значение введённое с клавиатуры
rep movsw   ;копируем элементы массива
 
;подготавливаем регистры для цикла сортировки
mov cx,ax   ;ax оставляем как постоянную N
mov bx,cx   ;j
sub cx,1    ;(n)число итераций на 1 меньше числа элементов
cont:       ;начало цикла for(i = N - 1; i > 0; i--)
 
mov al,populat[bx]  ;(temp) запоминаем для сравнения
 
whl: cmp bx,ax  ;начало цикла while(j <= N && rtabl[j] < temp)
jae fin             ;если j<N переходим к метке fin
cmp populat[bx],dx  ;если нет, сравниваем rtabl[j] и temp
jge fin2            ;и если rtabl[j] > temp
mov rtabl[bx],rtabl[bx-1]   ;иначе rtabl[j]=rtabl[j-1]
dec(bx)     ;j--
jmp whl
 
fin:    ;т.к. пока j<=N
cmp populat[bx],dx
jae fin2
mov rtabl[bx],rtabl[bx-1]
dec(bx)
 
fin2:
mov rtabl[bx],rtabl[dx]
mov populat[bx],dx
loop cont
;-------------------------------------------
main:
mov ax,@data    
mov ds,ax
mov es,ax
cld     ;Сброс флага DF
 
mov cx,N    ;счетчик строк ИТ 
mov dx,0    ;счетчик строк РТ
lea si,itabl    ;адрес первой строки ИТ 
lea di,rtabl    ;адрес первой строки РТ        
 
POPULATION  ;здесь код макроса подсчёта плотности населения
READKEY     ;здесь код макроса приглашения ввести число стран
call sort   ;вызов процедуры сортировки
PRINTTABL1  ;здесь код макроса вывода ИТ

mov ah,4ch
mov al,0
int 21h
end main

Решение задачи: «Инициализация структуры»

textual
Листинг программы
    country db 10 dup ?      ;название страны
    continent db 7 dup ?     ;название континента

Объяснение кода листинга программы

  1. country - название переменной, которая содержит название страны. Тип данных - DB (строка символов). Длина строки - 10 символов. Начальное значение - пустая строка (обозначена символами ?).
  2. continent - название переменной, которая содержит название континента. Тип данных - DB (строка символов). Длина строки - 7 символов. Начальное значение - пустая строка (обозначена символами ?).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы