https://github.com/juliano-xd/math
Uma calculadora completa em assembly para calculos de numeros de 256 bits
https://github.com/juliano-xd/math
assembly math
Last synced: 4 months ago
JSON representation
Uma calculadora completa em assembly para calculos de numeros de 256 bits
- Host: GitHub
- URL: https://github.com/juliano-xd/math
- Owner: juliano-xd
- License: mit
- Created: 2024-09-13T14:32:58.000Z (almost 2 years ago)
- Default Branch: main
- Last Pushed: 2024-11-12T14:27:02.000Z (over 1 year ago)
- Last Synced: 2025-08-10T10:29:36.809Z (11 months ago)
- Topics: assembly, math
- Language: Assembly
- Homepage:
- Size: 19.5 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Operações de Números de 256 Bits em Assembly
Este repositório foi desenvolvido para otimizar cálculos com números inteiros positivos de 256 bits, utilizando Assembly para garantir alta eficiência em operações aritméticas. É projetado para ser usado com código em C.
Desenvolvido para: x86_64
## Operações suportadas
Atualmente, o repositório oferece suporte para as seguintes operações:
* **Soma** `bigSum`: `A += B`
* **Soma um** `bigSumOne`: `A++`
* **Subtração** `bigSub`: `A -= B`
* **Subtrai um** `bigSubOne`:`A--`
* **Multiplicação** `bigMul`: `A *= B`
* **Comparação de igualdade** `bigEql`:`A == B`
* **Comparação de diferença** `bigDif`:`A != B`
* **Comparação maior-que** `bigGreater`:`A > B`
* **Comparação menor-que** `bigLess`:`A < B`
## Metas para a proxima atualização
* **Divisão** `bigDiv`:`A /= B`
* **Modulo** será o valor de retorno de `bigDiv`
* **ShiftLeft** `bigShl`:`A = A << x` sendo `x` um valor de 0 a 256
* **ShiftRight** `bigShr`:`A = A >> x` sendo `x` um valor de 0 a 256
* **Elevado ao quadrado** `bigSqr`:`A = A²`
* **Elevado ao cubo** `bigCbe`:`A = A³`
Essas funções manipulam dois números de 256 bits, representados como dois arrays de `unsigned long long int` com 4 elementos cada (`number[4]`). O overflow é tratado corretamente, e cada array é considerado como um único número de 256 bits.
**Exemplo de uso**
```c
#include
int main() {
_uint256t numberA = {0xA1B2C3D4E5F67890, 0xA1B2C3D4E5F67890, 0xA1B2C3D4E5F67890, 0xA1B2C3D4E5F67897};
_uint256t numberB = {0xA1B2C3D4E5F67890, 0xA1B2C3D4E5F67890, 0xA1B2C3D4E5F67890, 0xA1B2C3D4E5F67897};
// Realiza a soma: numberA += numberB
bigSum(numberA, numberB);
// Realiza a soma: numberA++
bigSumOne(numberA);
// Realiza a subtração: numberA -= numberB
bigSub(numberA, numberB);
// Realiza a subtração: numberA--
bigSubOne(numberA);
// Realiza a multiplicação: numberA *= numberB
bigMul(numberA, numberB);
_Bool test;
// Realiza a comparação: numberA == numberB
test = bigEql(numberA, numberB);
// Realiza a comparação: numberA != numberB
test = bigDif(numberA, numberB);
// Realiza a comparação: numberA > numberB
test = bigGreater(numberA, numberB);
// Realiza a comparação: numberA < numberB
test = bigLess(numberA, numberB);
return 0;
}
```
## Diferenciais
**Desempenho**
As funções são implementadas em Assembly para maximizar a eficiência, operando diretamente com instruções de máquina e minimizando o uso de recursos. Ao contrário de implementações como `BigInteger`, que dividem números em bytes e processam cada byte individualmente, este repositório realiza cálculos com números no formato nativo da CPU x86_64. As operações são feitas com tamanhos fixos e sem verificações desnecessárias, focando exclusivamente no tratamento de overflow e na propagação de carry.
## Download e Compilação
```shell
git clone https://github.com/juliano-xd/Math.git
cd Math
sudo make install # realiza todo o processo de instalação
```
Apos instalado, para poder linkar o math ao seu projeto, basta incluir `-lmath` a linha de compilação do gcc, por exemplo:
```shell
gcc -o main main.c -lmath
```
**Para rodar**
```shell
./main
```