Вопрос к знатокам assemblera

Вопрос к знатокам assemblera
Есть такой код в IDА - старой DOS проги (нумерацию строк добавил я, в IDА их нет) :
01: public start
02: start:
03: mov bp, seg DATA
04: test bp, bp
05: jnz short loc_1
06: mov bp, ds
07: loc_1:
08: mov cs:offsets1, ds
09: mov bx, ds:2
Насколько я разобрался (а я в Ассемблере не очень силен) - это начало процедуры которой передается управление в программе, и в момент инициализации в ds - адрес начала PSP, этот же адрес помещается в регистр bp(строка 06) и в ячейку памяти по адресу cs:offsets1(строка 1), а так как я понял что cs указывает на начало сегмета кода, то этот адрес находится в слове от начала процедуры старт, основной вопрос у меня вызывает строка 09, что происходит там? в bx - помещается содержимое ds:2 или адрес? поскольку далее (как я понял - возможно не верно) идет сжатие (?) памяти выделенной программе DOS-ом:
10: sub bx, bp
11: cmp bx, 1000h
12: jbe short loc_2
13: lea bx, [bp+1000h]
14: mov ax, es
15: sub bx, ax
16: mov ah, 4Ah
17: int 21h ; DOS - 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK)
; ES = segment address of block to change
; BX = new size in paragraphs
18: mov bx, 1000h
loc_2: остальной код
Помогите понять, честно несколько дней убил на поиск и изучение информации, но так и не понял что тут точно происходит. Спасибо.

  • 03: mov bp, seg DATA; в bp - адрес сегмента DATA
    04: test bp, bp
    05: jnz short loc_1;если в bp не 0, переход
    06: mov bp, ds;bp=ds
    07: loc_1:
    08: mov cs:offsets1, ds ;занести в cs:offsets1 содержимое ds
    09: mov bx, ds:2 ; занести в bx содержимое ячейки ds:2, там должен быть объем оперативной памяти
    10: sub bx, bp ; вычесть из bx bp, т. е. из общего объема памяти адрес PSP
    11: cmp bx, 1000h ;сравнить результат с 1000h
    12: jbe short loc_2 ;если меньше или равно, переход
    13: lea bx, [bp+1000h] ;bx=bp+1000h, lea - занести адрес, а [bp+1000h] - ячейка (квадратные скобки - для косвенной адресации)
    14: mov ax, es
    15: sub bx, ax
    16: mov ah, 4Ah
    17: int 21h ; DOS - 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK)
    Этот код проверяет, сколько памяти осталось выше самой программы и если там есть 1000h параграфов, освобождает эту память. Похоже на начало резидента.