Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2012, 23:24   #1
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
Лампочка Передача одного из параметров в регистре EDX

Всем привет.
Вопрос такой. Пишу процедуру на встроенном ассемблере в Delphi.
Вот код:
Код:
procedure TSoundData.FRearrange(var Data, Buffer; Count: Integer);
var
  // Размер блока в словах, на который разделены данные
  HalfSize: Integer;

  // Размер данных в словах
  Size: Integer;

  // Содержит количество блоков, на которые разделены данных
  HalfCount: Integer;
asm
  push EBX
  push ESI
  push EDI

  cld

  // Получение размера данных в словах
  mov EAX, Count
  shr EAX, 1
  mov Size, EAX

  // Инициализация HalfSize размером данных
  mov HalfSize, EAX

  // Инициализация количества блоков данных
  mov HalfCount, 1

@main:
  // Если половинный размер <= 2 (в двойных словах) то выход из цикла
  cmp HalfSize, 2
  jbe @exit

  // Копирование в буфер
  mov ESI, Data
  mov EDI, Buffer
  mov ECX, Size
  shr ECX, 1
  rep movsd

  // Установка количества блоков данных
  mov ECX, HalfCount

@copy:
  // Уменьшаем на 1, чтобы вычислить адрес блока
  dec ECX

  // Вычисление адреса приемника данных
  mov EAX, ECX
  mul HalfSize
  shl EAX, 1
  add EAX, Data
  mov EDI, EAX

  //mov EDI, Data
  // Вычисление относительного адреса источника данных
  mov EAX, ECX
  mul HalfSize
  shl EAX, 1

  // Вычисление количества итераций для копирования четных или нечетных слов
  mov EBX, HalfSize
  shr EBX, 1

  // Установка адреса источника данных
  mov ESI, EAX
  add ESI, Buffer

  // Установка количества итераций
  mov EDX, EBX

// Копирование четных данных
@copy_even:
  add ESI, 2
  movsw
  dec EDX
  jnz @copy_even

  // Установка адреса источника данных
  mov ESI, EAX
  add ESI, Buffer

  // Установка количества итераций
  mov EDX, EBX

// Копирование нечетных данных
@copy_odd:
  movsw
  add ESI, 2
  dec EDX
  jnz @copy_odd

  // Если не все половинки обработаны то продолжаем, иначе выход
  cmp ECX, 0
  ja @copy

  // Делим HalfSize на 2
  shr HalfSize, 1

  // Определение количества блоков данных
  shl HalfCount, 1

  jmp @main

@exit:
  pop EDI
  pop ESI
  pop EBX
end;
Соглашение о передаче параметров стоит по умолчанию, то есть "register" не ставил.
Но адрес, который передается как параметр Data передается не через стек, а через регистр EDX.
При выполнении команды mul (строчку кода выделил жирным и подчеркнул, этот же код на изображении ниже) регистр EDX "затирается" и вместе с ним и мой парметр Data.
Прикрепляю код в отладчике:


Хотелось бы узнать, я где-то ошибаюсь или это компилятор что-то попутал? Я же его не прошу передавать параметры через регистры.
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 30.11.2012 в 23:26.
chertovich вне форума Ответить с цитированием
Старый 01.12.2012, 00:10   #2
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Оказывается передача параметров через регистры стоит по умолчанию.
Какой посоветуете ставить соглашение вызова? Pascal или stdcall, и почему?
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 01.12.2012, 00:18   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я бы оставил по умолчанию если нет нужды экспорта, иначе stdcall.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2012, 00:20   #4
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
я бы оставил по умолчанию если нет нужды экспорта, иначе stdcall.
По умолчанию не подходит, ко причине проблемы о которой я написал выше. Я поставил stdcall
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Старый 01.12.2012, 00:32   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну тогда совет напоследок, для асм процедур строго указывайте соглашение о вызове.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2012, 00:34   #6
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну тогда совет напоследок, для асм процедур строго указывайте соглашение о вызове.
Спасибо. Оно и логично, поскольку от соглашения о вызове зависит и код)
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.
chertovich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров _Mixer_ Общие вопросы по Java, Java SE, Kotlin 0 22.09.2011 20:17
Передача параметров функции Кипящий чайник Общие вопросы C/C++ 12 11.08.2010 19:45
передача параметров в createprocess Consol Win Api 11 12.05.2010 13:49
Передача параметров aesoem Общие вопросы Delphi 8 15.07.2008 21:51
Передача параметров Gudzon Общие вопросы Delphi 12 08.02.2007 08:19