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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2009, 18:22   #1
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
Счастье с++ и ASM

помогите найти ошибку
Код:
#pragma once
#include <stdlib.h>
#include <iostream>
 
class bbyte
{
private:
        void *data;
public:
        bbyte(void)
        {
        data=malloc(sizeof(char));
        void *a=data;
        _asm{
        mov esi,0
        mov a, esi
        }
        }
 
        bbyte (const void *a){
                data=malloc(sizeof(char));
                void *b=data;
                _asm
        {
        mov esi, a
        cmp esi, 0
        je m1
        jne m2
m1:
        mov esi, 0
        mov b,esi
        jmp exit1
m2:
        mov esi,a
        mov b,esi
exit1:
        }
                }
        ~bbyte(void)
        {
                free((char*)data);
        }
friend bbyte add(bbyte &a,const bbyte &b)
        {
                void *c=a.data;
                void *d=b.data;
                void *e=malloc(sizeof(char));
                _asm
                {
                mov esi,c
                mov edi,d
                add esi,edi
                cmp esi,10
        jb m1
                sub esi,10
                mov e,1
        m1:
                mov a,esi
                }
                return bbyte(e);
        }
        bbyte &operator =(bbyte &b){
                void *c=this->data;
                void *d=b.data;
                _asm
                {
                mov esi,d
                mov c,esi               
                }
        return *this;
        }
 
        friend std::istream & operator >>(std::istream &is,bbyte &b)
        {
                is>>b.data;
        return is;
        }
        friend std::ostream & operator <<(std::ostream &os,bbyte &b){
                os<<(int)b.data;
        return os;
        }
};
main func

Код:
#include <iostream>
#include "bbyte.h"
using namespace std;
void main()
{
bbyte a,b,c;
cin>>a>>b;
c=add(a,b);
cout<<c;
cout<<a;
cout<<b;
}
ошибка такова переменную с закидывает мусором и потом не может удалить сам найти не могу
Моя работа - Создание сайтов
breate вне форума Ответить с цитированием
Старый 04.11.2009, 18:40   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Запутанный, неэффективный, избыточный код... И что он делает? )
Код:
 friend std::ostream & operator <<(std::ostream &os,bbyte &b){
                os<<(int)b.data;
Вы выводите указатель, естественно он будет выглядеть как мусор
netrino вне форума Ответить с цитированием
Старый 04.11.2009, 19:06   #3
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Запутанный, неэффективный, избыточный код
необходимо реализовать класс BCD, предложи лучше
Моя работа - Создание сайтов
breate вне форума Ответить с цитированием
Старый 04.11.2009, 20:00   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от breate Посмотреть сообщение
необходимо реализовать класс BCD, предложи лучше
Не буду - Ваше задание )
Вы бы для начала разобрались с BCD, хоть на вики гляньте...
Ещё советую получше узнать про ассемблерные вставки, синтаксис и т.д.
Код:
        bbyte(void)
        {
        data=malloc(sizeof(char));
        void *a=data;
        _asm{
        mov esi,0
        mov a, esi
        }
        }
дошёл только до этого, дальше даже не смотрел. Этот код абсолютно лишён смысла. Во-первых Вы выделяете в куче 1 байт, зачем? Ну ладно, может нравится так, но потом Вы определяете указатель, который указывает на только что выделенную память. А потом записываете в указатель 0. Не в память по адресу, что в указателе, а в сам указатель. Более того, esi - 4 байта, а выделили Вы лишь 1
Чтобы положить значение по адресу, хранящемуся в указателе нужно писать так:
Код:
mov ebx, a
mov [ebx], esi
И тем не менее не вижу смысла использовать тут ассемблерную вставку.
Короче говоря: Ваша ошибка - класс bbyte, перепишите его правильно и всё будет работать.
На всякий случай...
http://ru.wikipedia.org/wiki/Двоично-десятичный_код
netrino вне форума Ответить с цитированием
Старый 04.11.2009, 20:56   #5
breate
Пользователь
 
Аватар для breate
 
Регистрация: 30.12.2008
Сообщений: 78
Печаль

Цитата:
Сообщение от netrino Посмотреть сообщение
Код:
mov ebx, a
mov [ebx], esi
огромное спасибо за этот фрагмент

на счет кода после того как дописал и отладил убедился что смысла в этом нет...
Моя работа - Создание сайтов
breate вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ASM на Паскале! Doholyan Паскаль, Turbo Pascal, PascalABC.NET 6 29.08.2009 15:44
Помогите с ASM RomTB Помощь студентам 4 24.05.2009 11:27
ASM, pcx2bmp 1ntro Помощь студентам 1 15.03.2009 18:48
[c++]asm Nightwalker Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 14.10.2008 19:39
Delphi и ASM benjaminfran Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 17.02.2008 15:46