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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2013, 09:56   #1
TikTak93
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию Выполнить подсчёт выражения в ассемблере вставкой _asm в языке высокого уровня

Всем привет!
есть выражение: (A*X*X+B*X+C)div(D*X+E)
в первых скобках X в квадрате

задание: нужно выполнить подсчёт выражения в ассемблере вставкой _asm в языке высокого уровня, помогите пожалуйста сделать вычисление в этой вставке , всё остальное сам сделаю, сегодня нужно край сдать, иначе хана мне, есть такие кто скажет "делай сам", полагаюсь что остались люди которые могут еще помочь.
TikTak93 вне форума Ответить с цитированием
Старый 29.11.2013, 10:21   #2
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Пример для части выражения
Код:

{есть выражение: (A*X*X+B*X+C)div(D*X+E)
в первых скобках X в квадрате}
var
  res,a,b,c,d,e,x:dword;
begin
  a:=2;
  b:=3;
  x:=4;
  {a*x*x}
  asm
    mov eax,x //первый множитель
    mov ebx,x //второй множитель
    mul ebx   //умножили, результат в АХ
    mov ebx,a //занесли а
    mul ebx   //умножили, результат в АХ
    mov res,eax
  end;
  writeln(res);
end.
И так последовательно. Принцип, я думаю, ясен.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 29.11.2013, 10:26   #3
TikTak93
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию

да , спасибо большое только буду писать на C++ , пока только учусь.
TikTak93 вне форума Ответить с цитированием
Старый 29.11.2013, 10:28   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Цитата:
Сообщение от TikTak93 Посмотреть сообщение
да , спасибо большое только буду писать на C++ , пока только учусь.
Вы ж язык не написали какой нужен. Принцип такой же.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 29.11.2013, 12:28   #5
TikTak93
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию Помогите найти ошибку, и как вывести результат

выражение на ассемблере: (A*X*X+B*X+C)div(D*X+E)
в первых скобках X в квадрате

вычисление должно быть на ассемблере а вывод с помощью с++

вот код выражения, что тут неправильно?

mov eax,d
imul x
add eax,e
mov ecx,eax
mov eax,x
imul x
imul x
mov ebx,eax
mov eax,a
imul ebx,eax
mov edx,eax
mov eax,b
imul x
add eax,c
add edx,eax
cdq
idiv ecx

что тут неправильно , и как записать результат в какой регистр его вывести можно.
TikTak93 вне форума Ответить с цитированием
Старый 29.11.2013, 13:18   #6
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Код:
 asm
    mov eax,d
    imul x  //d*x
    add eax,e    //dx*+e
    mov ecx,eax
    mov eax,x
    imul x   //x^2
{    imul x}
    mov ebx,eax
    mov eax,a
    imul ebx,eax //x*x*a
    mov edx,ebx //не eax, a ebx, потому что результат там
    mov eax,b
    imul x // здесь регистр dx уходит в 0, почему не знаю
    add eax,c
    add edx,ebx
    cdq
    idiv ecx
    mov res,eax
  end;
Обнуление edx можно схитрить, записав содержимое регистра во вспомогательную переменную, а затем swap, но это не по-ассемблерски
Препод, я думаю, не одобрит

Последний раз редактировалось ZX Spectrum-128; 29.11.2013 в 13:31.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 29.11.2013, 13:34   #7
TikTak93
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию

что это обнуление даёт?

как понимать что это не по ассемблеровски? а по чём это? мне на другом форуме тоже вариант с обнулением предложили, работать же должно правильно?

Последний раз редактировалось Stilet; 29.11.2013 в 14:05.
TikTak93 вне форума Ответить с цитированием
Старый 29.11.2013, 13:36   #8
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Плохо, что обнуляется. В edx хоанилось x*x*a
Я бы так схитрил
...
Mov temp,edx
... // тут умножили и edx обнулился
Mov edx,temp

Использовать переменные яп при работе в асм - "хитрость"

Последний раз редактировалось ZX Spectrum-128; 29.11.2013 в 13:40.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 29.11.2013, 13:43   #9
TikTak93
 
Регистрация: 29.11.2013
Сообщений: 9
По умолчанию

что это обнуление даёт в программе ? он полюбому это спросит, а так всё работает, спасибо большое помогли.
TikTak93 вне форума Ответить с цитированием
Старый 29.11.2013, 13:46   #10
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Как работает? У меня не работает, потому что edx уходит в 0 и x*x*a теряется. Он (регистр) сам почему-то обнуляется. Ковыряться надо.
Ну раз у вас работает, то и ладушки.
Удачи на зачете!
ZX Spectrum-128 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написание пакетной утилиты ДОС средствами языка высокого уровня (ЯВУ). Дарья28066 Помощь студентам 0 14.10.2013 07:46
17. Составить программу логического отрицания и логического умножения двоичных чисел. Программа на языке высокого уровня. мурад05 Помощь студентам 1 08.10.2012 16:06
лабораторное задание по дисциплине "Программирование на языке высокого уровня" (с++) Иван Савин Помощь студентам 2 01.01.2011 18:36
Новый конкурс им. Парсифаля. Задача крайне высокого уровня сложности Парсифаль Общие вопросы C/C++ 32 09.05.2009 03:43