Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мусор в переменной 
:(
    Опции темы
<Spawn>
Дата 18.9.2003, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Изучаю асму. Но удивило, что при передаче параметра в асм-функцию переменная заполнена мусором.
Делаю так(Дельфи):

Код
function TestLoop(Value:integer):integer;
asm
 push eax
 mov  eax, Value
 mov cx,10
@m1:
 inc eax
 loop @m1
 mov Result, eax
 pop eax
end;

procedure TForm1.Button1Click(Sender: TObject);
var
int:integer;
Count:word;
begin
Randomize;
{Если не сделать очистку памяти. занимаемой переменной, то возвращается совсем не то что нужно}
ZeroMemory(@int,4);
int:=Random(20);
Count:=Random(20);
ShowMessage(IntToStr(TestLoop(int, Count)));
end;

И еще маленький вопросик - чем отличается объявление @m1 от @@m1? Всем заранее спасибо.
P.S.
Сори за простенькие вопросы - пару дней как книжку читаю.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Guest
Дата 18.9.2003, 05:30 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
чем отличается объявление @m1 от @@m1?

Ничем, только именем.

Странно, что функция с одним параметром, а ты передаешь два параметра...
Ну это ладно, видимо забыл сделать так:
function TestLoop(Value,Count:integer):integer;
В таком случае надо использовать не cx, а ecx, т.к. loop без префиксов работает с ecx - получается, что в старших 16-битах ecx содержится мусор, из-за этого видимо у тебя и выдает неправильный результат... Хотя mov cx, Count не откомпилировалось бы... Приведи правильный код.

  Вверх
p0s0l
Дата 18.9.2003, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Это я был выше...

Это сообщение отредактировал(а) p0s0l - 18.9.2003, 06:20


--------------------
С уважением, г-н Посол.
PM   Вверх
<Spawn>
Дата 18.9.2003, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Цитата(p0s0l @ 17.9.2003, 22:16)
Это я был выше...

Ах да)) Эт я сначала писал одно, потом другое проверил и в итоге забыл поменять:
Код
function TestLoop(Value:integer;Count:Word):integer;
asm
 push eax
 mov  eax, Value
 mov cx, Count
@m1:
 inc eax
 loop @m1
 mov Result, eax
 pop eax
end;

procedure TForm1.Button1Click(Sender: TObject);
var
int:integer;
Count:word;
begin
Randomize;
ZeroMemory(@int,4);
int:=Random(20);
Count:=Random(20);
ShowMessage(IntToStr(TestLoop(int, Count)));
end;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 18.9.2003, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Если не делать ZeroMemory(@int,4), то все повисает - в чем дело?


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
<Spawn>
Дата 18.9.2003, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Все спасибо, при использовании ecx все стало нормально


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
p0s0l
Дата 19.9.2003, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Цитата
Если не делать ZeroMemory(@int,4), то все повисает - в чем дело?

Дело было в том, что после Randomize в ECX было какое-то большое число. Последующие Random'ы ecx не трогали, поэтому когда в ты загружал CXпеременную Count, в старших 16-битах ecx был мусор - из-за этого цикл был у тебя офигенно длинным...
Если же поставить ZeroMemory, то она обнуляет ECX - ну и дальше понятно, что будет все нормально...



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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