Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [asm & pascal] сортировка массива, передача параметров в процедуру 
:(
    Опции темы
lemuriaIATE
Дата 27.11.2008, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.10.2007

Репутация: 1
Всего: 1



Здравствуйте. Вопрос такой. Есть программа, выполняющая сортировку массива, написана на паскале, но сама процедура сортировки на ассемблере. Интересует, каким образом передаются параметры из паскаля в ассемблер (по каким адресам), а если точнее - есть один конкретный вопрос - что хранится по адресу [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]?? 
заранее очень благодарна.
хотя бы ссылочку...
PM MAIL ICQ   Вверх
volvo877
Дата 27.11.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Цитата(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
PM MAIL   Вверх
lemuriaIATE
Дата 27.11.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.10.2007

Репутация: 1
Всего: 1



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

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

Это сообщение отредактировал(а) lemuriaIATE - 27.11.2008, 13:38
PM MAIL ICQ   Вверх
volvo877
Дата 27.11.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



Во-первых, где ты в коде видишь это пресловутое [bp + 8]? +6 вижу, +10 тоже, где +8 ??? А во-вторых - хинт: не все параметры имеют длину в 2 байта. Есть и четырех-байтовые, правда? Например, указатели. А у тебя второй параметр - это что? Посмотри...
PM MAIL   Вверх
lemuriaIATE
Дата 27.11.2008, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.10.2007

Репутация: 1
Всего: 1



во-первых, этот вопрос с пресловутым [bp + 8] мне задал препод, так что это не мое занудство smile 
во-вторых, да, второй параметр - указатель, но находится-то в 2х байтовом регистре и к [bp + 8] отношения не имеет, по крайней мере так мне сказал тот же препод. но если есть другое мнение, то я готова к нему прислушаться.
PM MAIL ICQ   Вверх
volvo877
Дата 27.11.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



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

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



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


Это сообщение отредактировал(а) volvo877 - 27.11.2008, 16:04
PM MAIL   Вверх
lemuriaIATE
Дата 27.11.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.10.2007

Репутация: 1
Всего: 1



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

mov  Bx,[bp+6]



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

DS? это если по фаронову. не задавайте мне таких вопросов)) у меня сейчас в голове полный бред. 
то есть по-вашему и [BP + 6] и [BP + 8] занимает указатель? спасибо, я вроде бы начинаю понимать. 
а в BX тогда получается мы заносим только смещение, т.е. последние 2 байта?
PM MAIL ICQ   Вверх
volvo877
Дата 27.11.2008, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 34
Всего: 116



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

Вот чтобы бред рассеялся - возьми тут статью, и почитай.
PM MAIL   Вверх
lemuriaIATE
Дата 27.11.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.10.2007

Репутация: 1
Всего: 1



спасибо!
PM MAIL ICQ   Вверх
phoenixwow
Дата 14.4.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 14.4.2009

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.