0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81

Вычислить значение выражения: ((2*c)-(d/3)) / (b-(a/4))

18.09.2017, 23:18. Показов 19808. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется пример ((2*c)-(d/3)) / (b-(a/4))
При клике на Btn1 значение выводится в Edit1
В качестве тестовых чисел я взял: a - 20 b - 10 c - 10 d - 30.Итоговый ответ должен получиться (20-(30/3))/(10-(20/4))=10/5=2
Использую ассемблерную вставку в Delphi
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
procedure TForm1.BitBtn1Click(Sender: TObject);
var
c:word;
begin
  asm
  // умножение 2 на 10
  mov al,2
  mov cl,10
  imul cl
  mov bl,al
  
  //деление 30 на 3
  mov ax,30
  mov cl,3
  div cl
  mov dl,al
 
  // подсчёт числителя
  sub bl,dl
 
  // деление 20 на 4
  mov ax,20
  mov cl,4
  div cl
  mov dl,al
 
  //разница 10 и предыдущего слагаемого
  mov al,10
  sub al,dl
 
  // подсчёт знаменателя
  idiv bl
 
  // передача значения переменной
  mov c,bl
  end;
  form1.Edit1.text:=inttostr(c);
end;
Сама ошибка - [Error] Unit1.pas(58): Operand size mismatch , выводится на mov c,bl , видимо ошибся в регистрах где-то, прошу указать на ошибку и подсказать как мне вывести значение, выводится в Edit1.
Так же готов выслушать советы по оптимизации, возможно где-то сделал лишние операции.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.09.2017, 23:18
Ответы с готовыми решениями:

Вычислить значение выражения A*B-C*D
A*B-C*D почему mul dx выводит результат ax а не в cx, умножив все 4 а не cx,dx в чем проблема? mov ax,127 mov bx,25 mul bx ...

Вычислить значение выражения
Вопрос! Нужно найти значение выражения z=(sqrt(|x|)-y)^2 Вот кусочек кода: finit fild x ;st(0)=x fabs ;st(0)=|x| fsqrt ...

Вычислить значение выражения
Всем привет. Помогите написать на ассемблере такое: Вот начал делать, но не уверен что правильно, допишите кому не сложно: ...

28
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
18.09.2017, 23:31
с - тип word = 2 байта
bl - регистр = 1 байт

И в целом - вычисления некорректны - результат умножения двух байтов - слово. И слово делится на байт, а не байт на байт.

Прочтите раздел о умножении и делении, например в Электронный учебник

Добавлено через 1 минуту
Сейчас попробую пример для числителя набрать.
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
18.09.2017, 23:35  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
с - тип word = 2 байта
bl - регистр = 1 байт
И в целом - вычисления некорректны - результат умножения двух байтов - слово. И слово делится на байт, а не байт на байт.
Прочтите раздел о умножении и делении, например в Электронный учебник
Да, по типам я понимаю, в предыдущей программе, которую я делал, я выводил таким образом, вот пример, с регистрами запутался, спасибо, сейчас посмотрю учебник.
По поводу вычислений, формулы брал на стороннем сайте и тестировал некоторые формулы отдельно, работало по отдельности, в совокупности пока не видел ошибок с вычислениями т.к проблема с типами.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.BitBtn11Click(Sender: TObject);
var
e,f:longint;
begin
  e:=strtoint(form1.LabeledEdit5.text);
  f:=strtoint(form1.LabeledEdit6.text);
  asm
    mov eax,e
    mov ebx,f
    add eax,ebx
    sub ebx,eax
    neg ebx
    sub eax,ebx
    mov e,eax
    mov f,ebx
  end;
  form1.LabeledEdit5.text:=inttostr(e);
  form1.LabeledEdit6.text:=inttostr(f);
end;
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
18.09.2017, 23:37
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  a, c, d: byte;
  r: word;
begin
{ ((2*c)-(d/3)) }
  asm
    mov al, c
    mov bl, 2
    imul bl
    mov dx, ax
 
    mov al, d
    cbw
    mov bl, 3
    idiv bl
    cbw
 
    sub dx, ax
  end;
end;
Обратите внимание на команды cbw. Описание - в электронном учебнике. Назначение - выровнять разрядность операндов.
1
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
18.09.2017, 23:50  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Обратите внимание на команды cbw. Описание - в электронном учебнике. Назначение - выровнять разрядность операндов.
Да, ознакомился с вашим кодом, всё понял.
Подскажите, пожалуйста, каким образом мне теперь преобразовать регистр в строку(для вывода значения)?Какой существует самый простой способ для этого?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
19.09.2017, 00:12
Т.к. вы делаете во встроенном ассемблере, то применяйте встроенные средства (inttostr).
Только придётся перейти на тип переменных longint и соразмерные регистры eax, ebx, ecx и пр.

Тогда числитель будет
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var
  a, c, d: longint;
  r: longint;
begin
{ ((2*c)-(d/3)) }
  asm
    mov eax, c
    mov ebx, 2
    imul ebx
    push eax
    push edx
 
    mov  eax, d
    cdq
    mov  ebx, 3
    idiv ebx
    cdq
 
    pop  ebx
    pop  ecx
    sub  ecx, eax
    sbb  ebx, edx
    {теперь в регистровой паре edx:eax - числитель
    после деления на знаменатель - результат longint}
    ...........
    mov  r, eax
  end;
  form1.Edit1.text:=inttostr(r);
end;
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
19.09.2017, 00:51  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var
 a, c, d: longint;
r: longint;
begin
{ ((2*c)-(d/3)) }
asm
mov eax, c
mov ebx, 2
imul ebx
push eax
push edx
mov *eax, d
cdq
 mov *ebx, 3
idiv ebx
cdq
pop ebx
pop ecx
sub ecx, eax
sbb *ebx, edx
{теперь в регистровой паре edx:eax - числитель
после деления на знаменатель - результат longint}
...........
mov r, eax
end;
 form1.Edit1.text:=inttostr(r);
end;
В 9 строчке мы умножаем c*2
в 10 и 11 мы помещаем регистры в стек, в вершине стека edx = c*2? , ниже eax = c*2? , подскажите, слегка запутался(с учебником ознакомился, но не совсем понял про пару регистров), что пойдёт в эти регистры? c*2?
В 19 строчке из вершины стека(edx=...) мы кладём в ebx,далее eax кладём в ecx
Последние строчки уже зависят от ваших ответов, выглядит элементарно, но запутался.Попробовал скомпилировать данный код, взяв за c - 10, за d - 30, ответом по итогу должно быть 10(т.к пока что считаем числитель), но выходит 0, прокомментируйте, пожалуйста.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
19.09.2017, 06:49
Результат умножения - регистровая пара edx:eax.
После вычисления (2*c) результат помещается в стек - т.к. регистр edx будет затёрт при вычислении (d/3). Можно поместить и в свободные регистры (edi, esi).
Вычисляется (d/3). Результат приводится к размеру 8 байт (cdq).
Считываются из стека результаты предыдущего вычисления (2*c). Вычитание регистровой пары из другой (с заёмом).

Далее я ошибся, т.к. результат вычитания в (edx:ecx).
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
19.09.2017, 14:26  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Результат умножения - регистровая пара edx:eax.
После вычисления (2*c) результат помещается в стек - т.к. регистр edx будет затёрт при вычислении (d/3). Можно поместить и в свободные регистры (edi, esi).
Вычисляется (d/3). Результат приводится к размеру 8 байт (cdq).
Считываются из стека результаты предыдущего вычисления (2*c). Вычитание регистровой пары из другой (с заёмом).
Далее я ошибся, т.к. результат вычитания в (edx:ecx).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TForm1.BitBtn1Click(Sender: TObject);
var
a,c,d,r: longint;
begin
  asm
  mov eax,c
  mov ebx,2
  imul ebx
  push eax
  push edx
 
  mov eax,d
  cdq
  mov ebx,3
  idiv ebx
  cdq
 
  pop ebx
  pop ecx
  sub ecx,eax
  //sbb ebx,edx
 
  mov eax,a
  cdq
  mov ebx,4
  idiv ebx
  cdq
 
  mov ebx,b
  sub ebx,eax
 
  mov eax,ecx
  idiv ebx
 
 
  mov r, eax
  end;
  form1.Edit1.text:=inttostr(r);
  end;
Посмотрите,считает всё верно, разобрался в самом простом способе и разобрался в делении и регистрах.Что бы Вы могли посоветовать для оптимизации программы?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
19.09.2017, 18:19
Что-то всё равно не так. В некоторых местах усечение результата, а в некоторых (32-33) забываете, что idiv ebx означает не eax/ebx, а (edx:eax)/ebx.

Пока не усвоите твёрдо команды - не беритесь за оптимизацию.
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
20.09.2017, 00:02  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Что-то всё равно не так. В некоторых местах усечение результата, а в некоторых (32-33) забываете, что idiv ebx означает не eax/ebx, а (edx:eax)/ebx.
Пока не усвоите твёрдо команды - не беритесь за оптимизацию.
Я понял о чём вы, в итоге у меня не выводит остаток,подскажите, пожалуйста, как решить эту проблему?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
20.09.2017, 07:11
Вечером приду - наберу.
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
20.09.2017, 21:25  [ТС]
ФедосеевПавел, ок, спасибо
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
20.09.2017, 21:37
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
    ;((2*c)-(d/3))
    mov eax, c
    mov ebx, 2
    imul ebx
    push eax
    push edx
 
    mov  eax, d
    cdq
    mov  ebx, 3
    idiv ebx
    cdq
 
    pop  ebx
    pop  ecx
    sub  ecx, eax
    sbb  ebx, edx
    push ecx
    push ebx
 
    ;(b-(a/4))
    mov  eax, a
    cdq
    mov  ebx, 4
    idiv ebx
    mov  ebx, b
    sub  ebx, eax
 
    ;((2*c)-(d/3)) / (b-(a/4))
    pop  edx
    pop  eax
    idiv ebx
 
    mov r, eax
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
21.09.2017, 01:23  [ТС]
ФедосеевПавел, спасибо, буду тестировать и разбираться!
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
02.10.2017, 23:20  [ТС]
ФедосеевПавел, подскажите, пожалуйста, каким образом в ассемблере(встроенном в дельфи, в частности) можно, либо исключить возможность деления на ноль, либо при делении на 0 вывести Message('Деление на ноль')?
Т.е когда знаменатель у меня равен 0, мне выводит Division by zero, что логично, как поступить в данной ситуации, что можете порекомендовать?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
03.10.2017, 00:57
Проверять делитель перед операцией деления.
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
03.10.2017, 19:07  [ТС]
ФедосеевПавел, это я понимаю, но как это реализовывается?
Пробовал через try...except, не получается, по if...else не нашёл материала для ассемблера, встроенного в Delphi, поэтому и спрашиваю
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8606 / 4447 / 1663
Регистрация: 01.02.2015
Сообщений: 13,810
Записей в блоге: 9
03.10.2017, 19:41
Assembler
29
30
31
32
33
34
35
36
37
38
39
40
41
    ;((2*c)-(d/3)) / (b-(a/4))
    pop  edx
    pop  eax
 
    cmp  ebx, 0
    jne  Cont
 
    какие-то действия при делении на 0
 
Cont:
    idiv ebx
 
    mov r, eax
Добавлено через 1 минуту
А что делать - вы выбираете иди самостоятельно или преподаватель определяет.
0
0 / 0 / 0
Регистрация: 18.12.2015
Сообщений: 81
03.10.2017, 19:48  [ТС]
ФедосеевПавел, ок, изучу.
Понимаете, проблема в том, что я спрашивал каким образом это реализовать, не факт реализации, а команды(с помощью которых это можно сделать) или советы, но меня «мягко» послали на самостоятельное обучение, увы, гуглил и на английском и на русском, но плохо получилось разобраться, в целом, спасибо, посмотрю немного позже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2017, 19:48
Помогаю со студенческими работами здесь

Вычислить значение выражения
А, В, С, Х- целые знаковые числа размером в машинное слово Х= 5 (А - В) - 12С + 5 И что бы результат выводила на экран если можно ...

Вычислить значение выражения
помогите правильно написать задачу на ассемблере: (2*с/а – d*d)/( d + а – 1) по этому примеру title Lab3asm.asm ...

Вычислить значение выражения
Рассчитать значение формулы F=A+B-C/2+D Операнд А : значение 13 адрес 91 Операнд В : значение 159 адрес 46635 Операнд С : значение 39...

Вычислить значение выражения
разработать программу, вычисляющие заданное выражение. Посмотреть в отладчке форматы 3-4 mov и расшифровать двоичные коды этих команд. ...

Вычислить значение выражения
Ребята помогите найти ошибку в примере, просто нужно проверить и засунуть в дебагер. (2*C+d-52)/(a/4+1) 1)mov al,2 mov bl,c ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Исключения в Java: советы, примеры кода и многое другое
Javaican 18.05.2025
Исключения — это объекты, созданные когда программа сталкивается с непредвиденной ситуацией: файл не найден, сетевое соединение разорвано, деление на ноль. . . Список можно продолжать до бесконечности. . . .
Как сделать SSO (Single Sign-On) в C# приложении
stackOverflow 18.05.2025
SSO — это механизм, позволяющий пользователю пройти аутентификацию один раз и получить доступ к нескольким приложениям без повторного ввода учетных данных. Вы наверняка сталкивались с ним, когда. . .
Kubernetes с Apache Flink для обработки данных в реальном времени
Mr. Docker 17.05.2025
Kubernetes — это целая философия управления распределёнными приложениями. В отличие от "примитивных" решений вроде Docker Swarm, K8s (как его ласково называют в тусовке DevOps-инженеров) предлагает. . .
Использование декораторов в Python
py-thonny 17.05.2025
Если вы когда-нибудь задумывались о том, как красиво расширить функциональность кода без лишней возни и дублирования, декораторы в Python — та самая волшебная палочка, которую вы искали. По сути, это. . .
Реализация многопоточных сетевых серверов на Python
py-thonny 16.05.2025
Когда сталкиваешься с необходимостью писать высоконагруженные сетевые сервисы, выбор технологии имеет критическое значение. Python, со своей элегантностью и высоким уровнем абстракции, может. . .
C# и IoT: разработка Edge приложений с .NET и Azure IoT
UnmanagedCoder 16.05.2025
Мир меняется прямо на наших глазах, и интернет вещей (IoT) — один из главных катализаторов этих перемен. Если всего десять лет назад концепция "умных" устройств вызывала скептические улыбки, то. . .
Гибридные квантово-классические вычисления: Примеры оптимизации
EggHead 16.05.2025
Гибридные квантово-классические вычисления — это настоящий прорыв в подходах к решению сложнейших вычислительных задач. Представьте себе союз двух разных миров: классические компьютеры, с их. . .
Использование вебсокетов в приложениях Java с Netty
Javaican 16.05.2025
HTTP, краеугольный камень интернета, изначально был спроектирован для передачи гипертекста с минимальной интерактивностью. Его главный недостаток в контексте современных приложений — это. . .
Реализация операторов Kubernetes
Mr. Docker 16.05.2025
Концепция операторов Kubernetes зародилась в недрах компании CoreOS (позже купленной Red Hat), когда команда инженеров искала способ автоматизировать управление распределёнными базами данных в. . .
Отражение в C# и динамическое управление типами
stackOverflow 16.05.2025
Reflection API в . NET — это набор классов и интерфейсов в пространстве имён System. Reflection, который позволяет исследовать и манипулировать типами, методами, свойствами и другими элементами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru