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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2012, 13:23   #1
antoxamad
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 32
Вопрос Assembler лабораторная работа

Дано: A (integer); B (byte); C (smallint);
Вычислить: D = (A/B)*C; E = (C^2/B)-A

Первую формулу без проблем посчитал:
var
a,D,E,sss:Integer;
b:Byte;
c:SmallInt;
temp:Byte;

asm
mov ax, word ptr a
mov dx, word ptr a[2]
mov cl, b
mov ch, 0
div cx
mul c
mov word ptr D, ax
mov word ptr D[2], dx

Собственно как посчитать вторую а именно ()-А:
mov ax, c
mul c
mov cl, b
mov ch, 0
div cx

mov word prt sss, ax
end;

Подскажите пожалуйста
оп1 - 2байта - 16 бит
оп2 - 4байта - 32 бита
как из оп1 отнять оп2???
antoxamad вне форума Ответить с цитированием
Старый 23.10.2012, 13:37   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Первую формулу без проблем посчитал:
если Вам так кажется, то установите C в -1 и проверьте...

Цитата:
Подскажите пожалуйста
оп1 - 2байта - 16 бит
оп2 - 4байта - 32 бита
откуда вы получили 32 бита в вашей задаче - непонятно. Но, как вариант, поможет такой способ:
Код:
mov ax, 0
sub оп1, word ptr [оп2]
sbb ax, word ptr [оп2 + 2]
Результат будет в паре ax (старшее слово) и оп1(младшее слово). Но тут нужно правильно следить за знаковостью/беззнаковостью операндов. Этот пример для беззнаковых операндов.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 23.10.2012, 13:56   #3
antoxamad
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 32
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
если Вам так кажется, то установите C в -1 и проверьте...



откуда вы получили 32 бита в вашей задаче - непонятно. Но, как вариант, поможет такой способ:
Код:
mov ax, 0
sub оп1, word ptr [оп2]
sbb ax, word ptr [оп2 + 2]
Результат будет в паре ax (старшее слово) и оп1(младшее слово). Но тут нужно правильно следить за знаковостью/беззнаковостью операндов. Этот пример для беззнаковых операндов.
спс разобрался по поводу второй формулы, а по поводу -1 не понял почему не получается((((
вторую формулу сделал следующим образом:

Код:
  sub ax, word ptr a
  mov dx, 0
  sbb dx, word ptr a[2]
  mov word ptr E, ax
  mov word ptr E[2], dx
antoxamad вне форума Ответить с цитированием
Старый 23.10.2012, 14:38   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
а по поводу -1 не понял почему не получается((((
Ну прежде всего, величина в C знаковая, а умножение на C используется беззнаковое.

Цитата:
Код:
div cx 
mul c 
может стоит заменить на imul?
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 23.10.2012, 15:12   #5
antoxamad
Пользователь
 
Регистрация: 04.02.2012
Сообщений: 32
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Ну прежде всего, величина в C знаковая, а умножение на C используется беззнаковое.



может стоит заменить на imul?
вышел из ситуации следующим образом

Код:
 
  asm
  mov ax, word ptr a
  mov dx, word ptr a[2]
  mov cl, b
  mov ch, 0
  idiv cx
  imul c
  mov word ptr D, ax
  mov word ptr D[2], dx
antoxamad вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лабораторная по ЭВМ (Assembler) Warrior of light Фриланс 2 23.05.2012 14:42
Лабораторная работа Kris_18 Помощь студентам 0 15.05.2012 19:55
Лабораторная работа Новичек_Rudik Помощь студентам 2 19.04.2010 17:50
[C++]Лабораторная работа Sudeki Помощь студентам 0 17.11.2009 20:02
Лабораторная работа Дініс Фриланс 4 17.11.2009 13:26