Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с функцией на FASM'е, Мне чиста интересна... 
V
    Опции темы
Farmazon
Дата 27.10.2006, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



Вот Эта функция для переаода числа в строку, которую я сваял, при вызове, срабатывает, а потом почему-то прога вылетает... Чё тока ниделал...  Не знаю почему лаги такие.... 

Код

proc toStr Addr, Val
local  TmpStr db 5 dup(0)
  mov eax, [Val]
  mov bx, 10
  mov ecx, 0
  ciclptsb1:
    mov dx, 0
    div bx
    add dl, 48
    mov [TmpStr + ecx], dl
    inc ecx
    or eax, eax
  jnz ciclptsb1
  mov eax, ecx

  mov edx, [Addr]
  ciclptsb2:
    dec ecx
    mov bl, byte [TmpStr + ecx]
    mov byte [edx], bl
    inc edx
    or ecx, ecx
  jnz ciclptsb2
  ret
endp
 

хотя если её переделать в макрокоманду - то всё пашет.... 

Код

TmpStr db 5 dup(0)
macro toStr Addr, Val
{
  mov eax, Val
  mov bx, 10
  mov ecx, 0
  ciclptsb1:
    mov dx, 0
    div bx
    add dl, 48
    mov [TmpStr + ecx], dl
    inc ecx
    or eax, eax
  jnz ciclptsb1
  mov eax, ecx

  mov edx, Addr
  ciclptsb2:
    dec ecx
    mov bl, byte [TmpStr + ecx]
    mov byte [edx], bl
    inc edx
    or ecx, ecx
  jnz ciclptsb2
}


Странно не правда ли? Я в принципе магу и 2 вариант до ума довести и заюзать... Но мне чиста интересна - ПАЧЕМУ НЕ РАБОТЕТ?!


Это сообщение отредактировал(а) Farmazon - 27.10.2006, 18:44


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
Farmazon
Дата 27.10.2006, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



А уже разобрался так...

Пути мокрософты не исповедимы... Я вызывал ету функцию в событии прорисовки окна = глюк. Запихал в другое место = всё норм!
 smile 


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
dumb
Дата 28.10.2006, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



все регистры, кроме eax, edx, ecx сохранять надо и после использования восстанавливать. в данном случае, судя по описанию, проблема как-раз в несохранении ebx.
PM MAIL   Вверх
Farmazon
Дата 28.10.2006, 05:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



Не из-за этого... я добавлял "push ebx / pop ebx"... только толку шиш... Если функция используется в событии прорисовки окна - всё равно прога вылетает... А если в другом месте - всё норм.


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
sgi1981
Дата 28.10.2006, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сохранять все регистры в начале каждой функции командой 
pushad
восстанавливать все регистры перед ret командой
popad

!!!




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


sceloglauxalbifacies
****


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

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



если это рисовалка, то в eax вроде как надо что-то осмысленное записать. типо 0.  smile 
PM MAIL   Вверх
Farmazon
Дата 28.10.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



Быть может и из-за eax... Хотя врядли когда етот же код напрямую сттавил (Макрокомандой) всё работало...

Это сообщение отредактировал(а) Farmazon - 28.10.2006, 11:03


--------------------
Таково моё общее мнение.
PM MAIL WWW   Вверх
dumb
Дата 28.10.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



пригляделся. есть сурьезные основания считать, что причиной является маленький размер TmpStr: в варианте макроса он у тебя сидит в сегменте данных(с выравниваниями - т.е. либо вообще не задевает никого при переполнении, либо задевает, но то, что проявится потом), а в варианте процедуры - в стеке, который и рушится от переполнения TmpStr.
надо закладываться на максимальное кол-во цифр в числе. 11 - минимум, учитывая 0 в конце строки.
PM MAIL   Вверх
Farmazon
Дата 28.10.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Разработчик
**


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

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



Нет..... У меня и на 2-значном числе вылетает.... Мне в моём случае и 5 хватит. Максимальное значение числа - 60000... 

А 0 в конце TempStr мне зачем? У мня в неё записываются (остатки от деления на 10) + 48, потом символы в обратном порядке записываются по нужному адресу... Еслиб мне нужна была строка PChar, то просто перед ret поставил  бы "mov byte [edx], 0"... Мне просто не PChar нужна... Мне нужно просто перевести число в текстовое представление, и узнать, какой оно длины в текстовом виде.

Да я говорю что видимых ошибок нет - я всё перепробовал! Когда я использую эту функцию не в событии прорисовки окна, то прога не вылетает! Вот сейчас засунул ея в таймер - нет проблем...

ЗЫ: Ай, вобщем фиг сним, проблема решена... Задерживаться на этой фигне и время терять не буду... Счас работает - и ладно... Спасибо конечно что пытались помочь... Тему можно закрыть.



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

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

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


 




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


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

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