Página 1 de 1

Multiplicação int SDCC

MensagemEnviado: 25 Out 2006 16:04
por Iran
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.

MensagemEnviado: 25 Out 2006 16:51
por Maurício
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.

MensagemEnviado: 31 Out 2006 15:21
por Iran
A sugestão do Maurício não funcionou, grato mesmo assim

alguém tem mais alguma sugestão?

Iran

MensagemEnviado: 31 Out 2006 16:04
por andre_luis
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... ) .

MensagemEnviado: 31 Out 2006 17:35
por Maurício
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.

Re: Multiplicação int SDCC

MensagemEnviado: 13 Out 2014 15:21
por longo.251272
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