Как инициализировать кучу для дерева? (MASM)

pol62

Доброго времени суток!
Возник вопрос: как правильно организовать кучу для дальнейшего использования при работе с деревом?
Вот примерный текст:
PUSH_REG MACRO <X>
IRP p,<X>
PUSH p
ENDM
PUSH_REG ENDM

POP_REG MACRO <X>
IRP p,X>
POP p
ENDM
POP_REG ENDM
GET_TYPE MACRO X,Y
MOV X,TYPE Y
GET_TYPE ENDM
GET_TYPE_STRUCT MACRO X
GET_TYPE X,LIST
GET_TYPE_STRUCT ENDM
MAXIMUM_SYMBOLS EQU 8
MAXIMUM_WORDS EQU 20
NIL_CONST EQU 0
;; сегмент стека (потребуется в большинстве операций)
STACK_SEGMENT SEGMENT STACK
DB 128 dup(?)
STACK_SEGMENT ENDS
;; сегмент кучи, необходим для
HEAP_SEGMENT SEGMENT
HEAP_PTR DW ?
LIST DUP (MAXIMUM_WORDS) ;выделяем памяти на каждый лист
ENDS
LIST STRUCT
LEFT DB 0
RIGHT DB 0
;; латинских букв, нам хватит и байтов
ELEM DB MAXIMUM_SYMBOLS DUP (0)
LIST ENDS

; процедура инициализации heap
PROC_SEGMENT SEGMENT
INIT_HEAP PROC FAR
;; сохраняем регистры
PUSH_REG AX,BX,SI,DX,CX,DI
;; устанавливаем es на начало кучи
MOV DI,HEAP_SEGMENT
MOV ES,AX
;;устанавливаем счетчик цикла на количество элементов
MOV CX,MAXIMUM_WORDS
;; и устанавливаем количество байт, выделяемое под звено (структуру)
GET_TYPE_STRUCT DX
;; ноль - в регистр
MOV BX,NIL_CONST
;; пользуемся тем, что (8+2) * 20 < 255
MOV AX, MAXIMUM_WORDS
MOV AH, 0
MUL DL ;AX = AX*DL
MOV SI,AX
;; SI = MAXIMUM_WORDS*TYPE_OF_STRUCT - 2 (2 - это тип HEAP_PTR, слово)
SUB SI,2
L_INIT: MOV ES:[SI].LEFT,BX
MOV BX,SI
;; переходим к следующему элементу
SUB SI,DX
LOOP L_INIT
MOV ES:HEAP_PTR,BX
;; возвращаем значения регистров
POP_REG DX,SI,BX,AX,CX
RET
INIT_HEAP ENDP

PROC_SEGMENT ENDS

Нигде не ошибся? Не нужно ли изменить размер кучи на больший?
Спасибо за помощь!

roza200611

тебе бы снотворное продавать

shpanenoc

Нигде не ошибся?
Ошибся.
Раз:

PUSH_REG AX,BX,SI,DX,CX,DI
POP_REG DX,SI,BX,AX,CX

Два:

MOV DI,HEAP_SEGMENT
MOV ES,AX

Три:

L_INIT: MOV ES:[SI].LEFT,BX
; А как же RIGHT?..

Не нужно ли изменить размер кучи на больший?
Нужно. Напиши код, который не полагается на то, что размер кучи не может быть больше 31.

pol62

а что не так в left и right?
здесь же происходит создание списка свободной памяти, каждый элемент которого - лист.
листы соединены в список по left. зачем устанавливать right?

Vlad128

Оно не работает у тебя что ли? Ты же нормально разбираешься, к чему этот вопрос? Тут большинство асм проходили мильён лет назад и ломать голову мало кто захочет.

vitas66684

да паря молодец. хочет добить тему ятут фигею с такого любопытства ;)

Vlad128

да нет, помогли бы даже, если бы чего-то не понимал и был конкретный вопрос, просто тут вообще неясно, программа есть, чувак понимает что к чему, вопрос какой-то странный.

shpanenoc

Да, что-то я стормозил: подумал, что ты хочешь 2-направленный список.
Ну тогда см. ответы выше: чего тебе надо от нас, зачем ты принес нам 40 строк кода на ассемблере?

Serg1912

Спасибо за вопрос!
Оставить комментарий
Имя или ник:
Комментарий: