Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

14.11.2008, 12:49
|
|
Новичок
Регистрация: 14.11.2008
Сообщений: 2
Провел на форуме: 1684
Репутация:
0
|
|
Добрый день.
Скажите пожалуйста, почему различаются результаты при выполении арифметических операций на чистом С++ и при использовании АССЕМБЛЕРНОЙ ВСТАВКИ?
Код:
#include <iostream>
#include <windows.h>
#include <iomanip>
using namespace std;
BYTE ddS = 10;
BYTE ccS = 10;
BYTE aS = 6;
WORD NUM;
void main()
{
__asm
{
MOV AL, ccS
SUB AL, aS
INC AX
PUSH AX
MOV AL, ccS
MOV BL, ddS
CBW
DIV BL
PUSH AX
MOV AL, 3
MOV BL, aS
MUL BL
MOV BL, 2
CBW
DIV BL
POP BX
ADD AL, BL
POP BX
CBW
DIV BL
MOV NUM, AX
}
cout<<"ASSEMBLER = "<<NUM<<endl;
cout<<"C++ = "<<setprecision(3)<<showpoint<<(static_cast<float>(ccS)/ddS+(3*aS)/2)/(ccS-6+1)<<endl;
system("PAUSE");
}
Сейчас все сходится.
Но можете взять отличные от этих значения - увидите результат.
Нужно для вывода по лабе.
Благодарствую.
|
|
|

14.11.2008, 21:29
|
|
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме: 127017
Репутация:
61
|
|
потому что DIV и MUL работают с целыми числами. А на си, как я вижу ты работаешь с float
|
|
|

15.11.2008, 08:38
|
|
Новичок
Регистрация: 14.11.2008
Сообщений: 2
Провел на форуме: 1684
Репутация:
0
|
|
Сообщение от groupby
потому что DIV и MUL работают с целыми числами. А на си, как я вижу ты работаешь с float
Т.е. если я уберу static_cast, то результаты сойдутся, так?
|
|
|

15.11.2008, 13:38
|
|
Познающий
Регистрация: 21.09.2008
Сообщений: 42
Провел на форуме: 127017
Репутация:
61
|
|
Сходится все равно не всегда будут
Потому что если у тебя в процессе вычислений появятся отрицательные числа, то на асме у тебя снова не то получится  Нужно использовать команды IMUL, IDIV, SBB, ADC и т.д. Учи мат часть )
|
|
|

15.11.2008, 14:19
|
|
Участник форума
Регистрация: 31.10.2007
Сообщений: 213
Провел на форуме: 394522
Репутация:
14
|
|
Народ помогите доделать/исправить :
Во общем нужно :
1 - создать список целых значений
2- каждое новое значение должно входить в список только если раньше не встречалось !
3 - вывести список на екран !
У меня список создаетса , выводитса , но вот проверка на повторяемость не получается (она в программе закоментирована ) если ее раскоментировать то программа не работает ! Подскажите как организовать проверку ...
Код:
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
# include <conio.h>
# include <iostream.h>
#define MAX 100
typedef struct {
int elements[MAX];
int count;
} listtype;
void list_reset(listtype *list) {
list->elements[0]=0;
list->count=0;
}
void list_add(listtype *list,int element)
{
/* for(int i=0 ; i<list->count;i++)
{
if(list->elements[i] == element)
{
printf("Element [%i] is consist ! Input other el !",element);
getch();
}
else{*/
if (list->count != MAX)
list->elements[list->count++]=element;
//}
//}
}
void list_print(listtype *list){
int i;
for(i = 0;i < list->count;i++)
{
printf("Element[%i] = %i\n",i+1,list->elements[i]);
}
}
void main ()
{
clrscr();
listtype list;
int el;
list_reset(&list);
char c;
int K;
cout <<"Input First El :";cin>>el;
list_add(&list,el);
cout <<"\nAdd El ? [Y/N]";cin>>c;
while (c == 'Y' || c == 'y')
{
cout <<"\nInput El:";cin>>el;
list_add(&list,el);
cout <<"\nAdd El ? [Y/N]";cin>>c;
}
cout <<"\nPrint List ?[Y/N]";cin>>c;
if(c == 'Y' || c == 'y')
{
list_print(&list);
getch();
}
getchar();
}
|
|
|

15.11.2008, 16:46
|
|
Новичок
Регистрация: 08.11.2008
Сообщений: 9
Провел на форуме: 28743
Репутация:
-5
|
|
Помогите нарисовать блок-схему, очень надо!
1.3 Дано число. Определить, равна ли сумма двух первых цифр числа сумме двух его последних цифр
Код:
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int s1, s2;
long step (int i)
{
int g = 1, j;
for (j = 1; j < i; g *= 10, j++);
return g;
}
int main ()
{
int k;
printf ("Enter your number: ");
scanf ("%d", &k);
int l = k, g = 1;
while (l / 10 > 0)
{
l /= 10;
++g;
}
s1 = k / step (g) + (k / step (g - 1) % 10);
s2 = k % 10 + (k / step (2)) % 10;
return 0;
}
printf ("\n Summa dvuh mladshih cifr chisla ravna %d", s1);
printf ("\n Summa dvuh starshih cifr chisla ravna %d", s2);
if (s1 == s2)
{
printf("\n Summy ravny");
}
else
{
printf("\n Summy ne ravny");
}
getch();
Последний раз редактировалось velvetdust; 15.11.2008 в 21:22..
|
|
|

15.11.2008, 17:46
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме: 811764
Репутация:
119
|
|
velvetdust, блок-схему рисуют, ну или строят 
Что-то мне подсказывает, что код не дописан... 
|
|
|

16.11.2008, 18:20
|
|
Новичок
Регистрация: 08.11.2008
Сообщений: 9
Провел на форуме: 28743
Репутация:
-5
|
|
Нарисуйте хоть бы по этому коду))) Пожалуйста, очень надо!
|
|
|

16.11.2008, 19:37
|
|
Участник форума
Регистрация: 31.07.2008
Сообщений: 207
Провел на форуме: 299231
Репутация:
107
|
|
0 Инициализация
1 Вводим числа = строка .
2 Перегоняем в int два первых и два последних символа (способов много)
3 a = a1+a2; b = b1+b2;
4 если a == b пишем Ура иначе пишем Облом
5 чистим память и выводим копирайты )
|
|
|

16.11.2008, 20:21
|
|
Постоянный
Регистрация: 30.04.2008
Сообщений: 323
Провел на форуме: 379101
Репутация:
136
|
|
velvetdust хоть почитай как строятся блок схемы, там делов на 30 минут.
http://ru.wikipedia.org/wiki/Блок-схема
Ну или же воспользуйся автосоставителем блок схем
http://www.fceditor.nm.ru/
Лучше самому разобраться.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|