Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [asm & pascal] сортировка массива


Автор: lemuriaIATE 27.11.2008, 01:25
Здравствуйте. Вопрос такой. Есть программа, выполняющая сортировку массива, написана на паскале, но сама процедура сортировки на ассемблере. Интересует, каким образом передаются параметры из паскаля в ассемблер (по каким адресам), а если точнее - есть один конкретный вопрос - что хранится по адресу [bp+8]. Перечитала уже много всего по этому вопросу, ничего толкового не нашла, ответьте, пожалуйста, или хотя бы дайте скажите, где про это хорошо и подробно написано. 

Код

program insert_sort;
{$L insert.obj}
procedure ins_sort(n:integer;var data:array of integer);external; 
const n=10;
var
   a: array [1..n] of integer;
   i:integer;
BEGIN
randomize;
writeln('Данный массив');
for i:=1 to n do
   a[i]:=random(100);
for i:=1 to n do write(a[i]:4);
writeln;
ins_sort(n,a);
writeln('Отсортированный массив:');
for i:=1 to n do write(a[i]:4);
writeln;
readln;
END.



Код

code segment
assume cs:code
start:
ins_sort proc   push bp
   mov bp,sp
   pusha

   MOV  dX,[BP+10]
   mov  Bx,[bp+6]
   mov  cx,dx
   dec cx
   mov si,bx
   add si,2
elem:
   mov di,si
   sub di,2
seek_place:
   mov dx,[di]
   cmp dx,[si]
   jng found

   sub di,2
   cmp di,bx
   jl found
   jmp seek_place
found:
   mov ax,si   sub ax,2
   cmp ax,di
   je not_found
   mov ax,[si]
   push ax
   mov dx,di
   mov di,si
   sub di,2
shift:
   mov ax,[di]
   mov [di+2],ax
   sub di,2
   cmp di,dx
   jg shift

   mov di,dx
   add di,2
   pop ax
   mov [di],ax
not_found:
   add si,2
   loop elem

   popa
   pop bp
   ret
endp ins_sort
code ends
public ins_sort
end start



что же хранится в этом проклятом [bp+8]?? 
заранее очень благодарна.
хотя бы ссылочку...

Автор: volvo877 27.11.2008, 10:36
Цитата(lemuriaIATE @  27.11.2008,  00:25 Найти цитируемый пост)
что же хранится в этом проклятом [bp+8]?? 


Цитата
Положения параметров в стеке фиксированы относительно начала фрейма,  заданного значением указателя ВР.  Первые 4 байта заняты адресом возврата и старым значением SP,  еще 2 байта - регистром счетчика команд, а параметры занимают по 2 следующих байта  и  поэтому адресуются конструкциями вида [BP + 6] и [BP + 8]. Следует иметь в виду, что при обращении к <...> процедуре из паскаля стек заполняется от старших адресов к младшим, поэтому первый параметр находится дальше всего от позиции, на которую указывает регистр ВР. Если бы параметров было 4, то они бы адресовались с помощью следующих выражений: [BP + 6] - адрес 4-го двухбайтового параметра, [BP + 8] - адрес 3-го двухбайтового параметра, [BP + 10] - адрес 2-го двухбайтового параметра, [BP + 12] - адрес 1-го двухбайтового параметра.
Этого достаточно? smile

Автор: lemuriaIATE 27.11.2008, 13:36
в том-то и дело, что по-хорошему все и должно быть именно так, однако здесь всего два параметра и передаются они в  [BP + 6] и [BP +10], т.е. не подряд. можно было бы предположить, что в [BP + 8] ничего и нет и просто нехорошо написан код, но что-то там точно есть, и судя по всему там какой-то еще параметр, но какой??  или я ошибаюсь?  smile 

есть мнение, что там смешение сегмента данных процедуры относительно основной программы, это может быть правдой?

Автор: volvo877 27.11.2008, 14:10
Во-первых, где ты в коде видишь это пресловутое [bp + 8]? +6 вижу, +10 тоже, где +8 ??? А во-вторых - хинт: не все параметры имеют длину в 2 байта. Есть и четырех-байтовые, правда? Например, указатели. А у тебя второй параметр - это что? Посмотри...

Автор: lemuriaIATE 27.11.2008, 15:04
во-первых, этот вопрос с пресловутым [bp + 8] мне задал препод, так что это не мое занудство smile 
во-вторых, да, второй параметр - указатель, но находится-то в 2х байтовом регистре и к [bp + 8] отношения не имеет, по крайней мере так мне сказал тот же препод. но если есть другое мнение, то я готова к нему прислушаться.

Автор: volvo877 27.11.2008, 15:16
Цитата(lemuriaIATE @  27.11.2008,  14:04 Найти цитируемый пост)
второй параметр - указатель, но находится-то в 2х байтовом регистре
Это с чего бы? Кто его туда запихал, интересно? (вопрос на засыпку: в каком именно регистре по-твоему, находится второй параметр?) Параметр - значит, передается через стек.

Указатели в TP имеют длину в 32 бита, от этого никуда не денешься. Значит и передаваться будут в процедуру, как 4-х байтовые (не двух, а четырех, и не через регистры, а через стек). Вот и смотри, что вышло: последний параметр - четырехбайтовый - начинается с [BP + 6], а первый - двухбайтовый Integer - с [BP + 6 + 4], т.е., с [BP + 10]...



Уточнение: если тебя интересует, что именно находится по адресу [BP+8] - это сегментная часть адреса массива. Смещение лежит в [BP+6].

Автор: lemuriaIATE 27.11.2008, 16:06
неправильно  выразилась значит, имела в виду то что bx 2х байтовый  
Код

mov  Bx,[bp+6]



Цитата(volvo877 @  27.11.2008,  15:16 Найти цитируемый пост)
(вопрос на засыпку: в каком именно регистре по-твоему, находится второй параметр?)

DS? это если по фаронову. не задавайте мне таких вопросов)) у меня сейчас в голове полный бред. 
то есть по-вашему и [BP + 6] и [BP + 8] занимает указатель? спасибо, я вроде бы начинаю понимать. 
а в BX тогда получается мы заносим только смещение, т.е. последние 2 байта?

Автор: volvo877 27.11.2008, 16:24
Цитата(lemuriaIATE @  27.11.2008,  15:06 Найти цитируемый пост)
у меня сейчас в голове полный бред. 

Вот чтобы бред рассеялся - возьми http://forum.sources.ru/index.php?showtopic=80077&view=findpost&p=571792 статью, и почитай.

Автор: lemuriaIATE 27.11.2008, 20:56
спасибо!

Автор: phoenixwow 14.4.2009, 17:19
[Assembler]Задан массив из 20 элементов.Найти и вывести последний из четных элементов массива кратный числу 8

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)