Multiplicação int SDCC

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

Multiplicação int SDCC

Mensagempor Iran » 25 Out 2006 16:04

Meus Amigos,

No manual do SDCC está escrito:

"3.14 int (16 bit) and long (32 bit) Support

For signed & unsigned int (16 bit) and long (32 bit) variables, division, multiplication and modulus operations are
implemented by support routines. These support routines are all developed in ANSI-C to facilitate porting to other
MCUs, although some model specific assembler optimizations are used. The following files contain the described
routines, all of them can be found in <installdir>/share/sdcc/lib.

Function Description

_mulint.c 16 bit multiplication
_divsint.c signed 16 bit division (calls _divuint)
_divuint.c unsigned 16 bit division
_modsint.c signed 16 bit modulus (calls _moduint)
_moduint.c unsigned 16 bit modulus
_mullong.c 32 bit multiplication
_divslong.c signed 32 division (calls _divulong)
_divulong.c unsigned 32 division
_modslong.c signed 32 bit modulus (calls _modulong)
_modulong.c unsigned 32 bit modulus

Since they are compiled as non-reentrant, interrupt service routines should not do any of the above operations.
If this is unavoidable then the above routines will need to be compiled with the --stack-auto option, after which
the source program will have to be compiled with --int-long-reent option. Notice that you don’t have to call these
routines directly. The compiler will use them automatically every time an integer operation is required."

No entanto quando multiplico 2 números do tipo int como no programa abaixo


cpp code
#include <at89s8252.h>

unsigned int op1 = 734;
unsigned int op2 = 855;
unsigned long int resultado;

void main(void)

{
resultado = (op1 * op2);
while(1);

}


a variável resultado continua igual a zero.

O que está errado?

Como faço para usar a função mulint.c ?

Agradeço qq dica.

Iran.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Maurício » 25 Out 2006 16:51

olá, Iran.

experimenta isto:

resultado = (long)(op1) * (long)(op2);

ooppss !! uma outra coisa que me ocorreu aqui.
o resultado pode ser zero, por causa da otimização do compilador.
como a variável resultado não é usada em lugar algum, o compilador simplesmente ignora a operação.

[]'s

RETI.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor Iran » 31 Out 2006 15:21

A sugestão do Maurício não funcionou, grato mesmo assim

alguém tem mais alguma sugestão?

Iran
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor andre_luis » 31 Out 2006 16:04

o resultado pode ser zero, por causa da otimização do compilador.


Realmente parece ser a unica causa para isso.
Tenta rodar passo-a-passo ( simulacao ) e/ou coloca nessa álgebra a leitura de uma variável de registrador que voce sabe que nao vai mudar, para confirmar a teoria do mauricio ( ex.: serial, pino de I/O, etc... ) .
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Maurício » 31 Out 2006 17:35

a dica do André é legal.

uma outra alternativa seria isto aqui:

cpp code
#include <at89s8252.h> 

unsigned int op1 = 734;
unsigned int op2 = 855;
unsigned long int resultado, xis;

void main(void)

{
resultado = (long)(op1) * (long)(op2);
xis = resultado; // a partir daqui, é só pra forçar o compilador a atribuir os valores; são variáveis "bobas"
xis++; // mas, a variável resultado, deve ter guardado valor correto
while(1);

}


se não funcionar, lamento, no Keil funcionou perfeitamente ! depois do casting, claro !!

[]'s

RETI.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Re: Multiplicação int SDCC

Mensagempor longo.251272 » 13 Out 2014 15:21

Boa tarde pessoal,

Estou com o mesmo problema, fazendo os cálculos abaixo o resultado esta saindo errado,

signed long int xdata Resultado;


Resultado = 512;
Resultado = Resultado * EEPROM93xx_read( DesenhoCamadas ); // Resultado * 50 = 25600
Resultado = Resultado + ( EEPROM93xx_read( DesenhoAjuste ) - 100 ); // Resultado + ( 86 - 100 ) = 25586
Resultado = (long)(Resultado) * (long)(4) / (long)(5); // Resultado * 4 / 5 = 7361 *** AQUI OCORRE O ERRO - Esta retornando 7361, como se ele estivesse fazendo o calculo usando variáveis do tipo int.

Alguém pode me dar uma ajuda.
Abraços
Ricardo
longo.251272
Byte
 
Mensagens: 318
Registrado em: 08 Nov 2011 11:58
Localização: São Paulo - SP


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Bing [Bot] e 1 visitante

x