|  ассемблерная вставка в Delphi, макросы | 
 ПРАВИЛА РАЗДЕЛА!!!
 ПРАВИЛА РАЗДЕЛА!!!1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE] 
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали! 
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
 
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
|   | 
|  ассемблерная вставка в Delphi, макросы | 
| marwell |    24.05.2012 12:17 
				 Сообщение
					#1				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | доброго дня необходимо вычислить интеграл методом прямоугольников (ассемблерная вставка в Delphi или в паскаль) сам метод мне понятен но, на каждом шаге мне нужно будет вычислять значение функции в определенной точке. хотел было использовать макросы но не тут то было, ни паскаль ни Delphi макросы не принимают может я неправильно описываю эти макросы? var n,a,b: integer; [Error] Project1.dpr(18): Undeclared identifier: 'funct' думал что макросы описываются след образом: <имя> macro парам1, парам2... парам N ... ...набор команд ... endm | 
| IUnknown |  24.05.2012 12:43 
				 Сообщение
					#2				
			 | 
|  a.k.a. volvo877      Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация:  627    | MACRO встроенным ассемблером не поддерживается. Поддерживаются инструкции, а не препроцессор. Используй функции. | 
| marwell |  24.05.2012 14:07 
				 Сообщение
					#3				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | var n,a,b: integer; почему происходит деление на ноль? я же прибавляю перед делением h fld x | 
| marwell |  24.05.2012 14:28 
				 Сообщение
					#4				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | аа, дело в 
 fdivr st(1),st кажется там на каждом шаге номер меняется? на первом шаге надо st(5) делить на st(6)? или я неправильно понял структуру стека? Сообщение отредактировано: marwell - 24.05.2012 14:32 | 
| IUnknown |  24.05.2012 14:29 
				 Сообщение
					#5				
			 | 
|  a.k.a. volvo877      Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация:  627    | |
| marwell |  24.05.2012 14:33 
				 Сообщение
					#6				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | сорри, успел отредактировать свое предыдущее сообщение до того как увидел ваш ответ а насчет прикрепленной картинки, как то не очень понятно  Добавлено через 6 мин. на каком то шаге тангенс равен 0? | 
| IUnknown |  24.05.2012 14:41 
				 Сообщение
					#7				
			 | 
|  a.k.a. volvo877      Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация:  627    | Посмотри на содержимое стека FPU. Сколько там осталось свободных регистров? Нисколько. Вот поэтому и вылет: переполнение стека FPU. Чистить стек нужно. | 
| marwell |  24.05.2012 15:00 
				 Сообщение
					#8				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | спасибо! var n,a,b: integer; осталось понять почему считает неправильно. res почему то всегда равен введенному n | 
| IUnknown |  24.05.2012 15:27 
				 Сообщение
					#9				
			 | 
|  a.k.a. volvo877      Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация:  627    | Функция какая у тебя, тангенс или котенгенс? Если тангенс - то вот так: asm (логика очень проста: в стеке держим только приращение в ST1, и текущее значение X в ST0, все остальное сразу после вычисления убираем). Если функция - КОтангенс - поменяй fdivp на fdivrp | 
| marwell |  24.05.2012 16:00 
				 Сообщение
					#10				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | Функция какая у тебя, тангенс или котенгенс? Если тангенс - то вот так: asm (логика очень проста: в стеке держим только приращение в ST1, и текущее значение X в ST0, все остальное сразу после вычисления убираем). Если функция - КОтангенс - поменяй fdivp на fdivrp спасибо! да, тангенс нужен. И логика понятна. Только Delphi ругается на эту строчку fadd st(1) говорит [Error] Project1.dpr(25): Invalid combination of opcode and operands | 
| IUnknown |  24.05.2012 16:29 
				 Сообщение
					#11				
			 | 
|  a.k.a. volvo877      Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация:  627    | FPC не ругается, в Дельфи сейчас посмотрю. Update Да, замени ту строку вот на эту: fadd st, st(1) Сообщение отредактировано: IUnknown - 24.05.2012 16:32 | 
| marwell |  24.05.2012 16:49 
				 Сообщение
					#12				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | FPC не ругается, в Дельфи сейчас посмотрю. Update Да, замени ту строку вот на эту: fadd st, st(1) сделал. Запускается без ошибок. Вот только ответ... Ответ должен быть приблизительно 0.261168 да? А прога при n=100 выдает 62,3434. Чем больше n, тем дальше ответ растет  | 
| IUnknown |  24.05.2012 17:41 
				 Сообщение
					#13				
			 | 
|  a.k.a. volvo877      Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация:  627    | Не верю   Ты просто не доделал метод прямоугольников. Вот код, вычисляющий значение и на Ассемблере, и на Паскале: program Project1;Чем выше N - тем выше точность. А так значения абсолютно одинаковые. Сообщение отредактировано: IUnknown - 24.05.2012 17:42 | 
| marwell |  24.05.2012 17:57 
				 Сообщение
					#14				
			 | 
| Бывалый    Группа: Пользователи Сообщений: 198 Пол: Мужской Репутация:  1    | Не верю  Ты просто не доделал метод прямоугольников. Вот код, вычисляющий значение и на Ассемблере, и на Паскале: program Project1;Чем выше N - тем выше точность. А так значения абсолютно одинаковые. большое и уже не первое спасибо  | 
| Fresselasuits |  9.04.2015 17:39 
				 Сообщение
					#15				
			 | 
| Группа: Пользователи Сообщений: 1 Пол: Женский Реальное имя: 23545678 Репутация:  0    | И всётаки, как в Delphi, с помощью asm можно вызвать прерывание, например  int 31h ? Очень надо | 
|   | 
|   | Текстовая версия | 1.11.2025 0:48 |