Junio 23, 2018, 09:07:17 pm

Autor Tema: ¿Cómo hago un loop para convertir de ASCII a decimal?  (Leído 11418 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado proxy_lainux

  • Me das tu IP?
  • *
  • Mensajes: 51
    • Ver Perfil
¿Cómo hago un loop para convertir de ASCII a decimal?
« en: Agosto 14, 2013, 11:22:47 am »
hola
 estaba haciendo una calculadora en asm, logre hacer la operacion de suma, pero tengo dos dudas

la primera es que tenia entendido que para pasar de ascii a decimal, habia que restar 48, estuve buscando por google y encontre que se podia  substraer 0 al registro que guarda la cantidad (aunque no entiendo como funciona) y lo hago de esta forma

Código: (asm) You are not allowed to view links. Register or Login
mov eax, dword[ebp - 16]
sub eax, '0000'
mov ebx, dword[ebp - 12]
sub ebx, '0000'

add eax, ebx
add eax, '0000'
mov[buf2], eax

mov eax, 4
mov ebx, 1
lea ecx, [buf2]
mov edx, 4
int 0x80

pero se me ocurrio que seria mas conveniente usar un loop que reste 48 a eax, en vez de utiliza ceros '0000', pero no logro hacerlo, quise hacerlo de esta forma pero no me funciona

Código: (asm) You are not allowed to view links. Register or Login
mov ecx, 4
rp:
mov eax, dword[ebp - 16]
sub al, 48
inc dword[ebp - 16]
dec ecx
jnz rp

dejo el codigo completo de como lo estoy haciendo, espero alguien me pueda decir como restar 48 a los datos guardados en ebp-16 y ebp-12 usando algun loop y como sumarle despues 48 para convertilo de nuevo a ascii

salu2

Código: (asm) You are not allowed to view links. Register or Login
[Bits 32]

global _start

section .data

tit: db "Inicio de calculadora",10,10,0
in: db "Escribe el nombre de la funcion",10,0
buf1: times 24 db (0)
buf2: times 20 db (0)

section .text

sumar:
push ebp
mov ebp, esp
sub esp, 16

mov eax, 4
mov ebx, 1
lea ecx, [ebp + 8]
mov edx, 4
int 0x80


mov eax, 3
mov ebx, 1
lea ecx, [ebp - 16]
mov edx, 5
int 0x80

mov eax, 3
mov ebx, 1
lea ecx, [ebp - 12]
mov edx, 5
int 0x80

mov eax, dword[ebp - 16]
sub eax, '0000'
mov ebx, dword[ebp - 12]
sub ebx, '0000'

add eax, ebx
add eax, '0000'
mov[buf2], eax

mov eax, 4
mov ebx, 1
lea ecx, [buf2]
mov edx, 4
int 0x80

mov esp, ebp
pop ebp

ret 8
_start:

mov eax, 4
mov ebx, 1
lea ecx, [tit]
mov edx, 23
int 0x80

mov eax, 4
mov ebx, 1
lea ecx, [in]
mov edx, 32
int 0x80

mov eax, 3
mov ebx, 1
lea ecx, [buf1]
mov edx, 8
int 0x80

cmp dword[buf1], "suma"
je suma
jne fin

suma:
push dword[buf1]
call sumar

fin:
mov eax, 1
int 0x80

EDITADO

perdon pero creo lo estoy haciendo mal, porque no me habia fijado que cuando sumo por ejemplo

1+3 = 4

pero cuando sumo

7 + 3 = en vez de ser 11 o en este caso 1 para sumar 1 al siguiente numero, me aparece el ascii ":"

7 + 3 = ":"

creo debo dejarlo como decimal, pero cuando intento dejarlo asi, no me aparece nada, alguien sabe porque?
« Última modificación: Agosto 23, 2013, 11:25:50 am por Binary_Death »

Desconectado mDrinky

  • Si te metes con CPH
    te metes conmigo
  • ****
  • Mensajes: 2868
    • Ver Perfil
Re:como hago un loop para convertir de ascii a decimal?
« Respuesta #1 en: Agosto 19, 2013, 08:23:51 pm »
Cuando tienes numeros de mas de una cifra tienes que ir dividiendo entre 10, ejemplo:

152.
152/10 = 15.2 -> paso el 2 a ascii.
15/10 = 1.5 -> paso el 5 a ascii.
Me sobra el 1 que lo paso a ascii.


You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
Que guapo soy!

Desconectado mr.blood

  • Yo vivo en CPH
  • ***
  • Mensajes: 1322
  • Sexo: Masculino
    • Ver Perfil
Re:como hago un loop para convertir de ascii a decimal?
« Respuesta #2 en: Agosto 20, 2013, 03:03:39 pm »
7 + 3 = en vez de ser 11[/b] o en este caso 1 para sumar 1 al siguiente numero, me aparece el ascii ":"

Me he debido perder...




No creo que eso funcione, de hecho eso creo que se usa para pasar de decimal a ascii, lo contrario a lo que pide (si me he enterado bien).



Si tu tienes un string pongamos "123" debes hacer lo siguiente. Te lo pongo en C para que lo entiendas mejor...

Código: (c) You are not allowed to view links. Register or Login
#include <stdio.h>
#include <string.h>

int powa(int base, int exponente);


int main()
{
char string[]="123";
int numero=0, i, len=strlen(string)-1;

for(i=0; i<=len; i++)
numero += (string[len-i]-0x30) * powa(10, i);

printf("%i", numero);

return 0;
}

int powa(int base, int exponente)
{
if(exponente==0)
return 1;
return powa(base, exponente-1) * base;
}

Espero que pues pasarlo a ASM :).

No es dificil, te explico:
Todo se resume en esta linea: numero += (string[len-i]-0x30) * powa(10, i);
Numero esta inicializado a 0.
(string[len-i]-0x30) Sirve para sacar el valor "real" del caracter numerico, es decir, del valor 0x33 (caracter '3') quedarse con 3.

Luego eso lo multiplicamos por 10^i y se lo sumamos a numero.

Explicando el ejemplo:

Primera vuelta: numero= numero -> (0) + (string[len-i]-0x30) -> (3) * 10^0 => numero=3
Segunda vuelta: numero= numero -> (3) + (string[len-i]-0x30) -> (2) * 10^1 => numero=23
Tercera vuelta: numero= numero -> (23) + (string[len-i]-0x30) -> (1) * 10^2 => numero=123

Sa1uDoS
You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login

Desconectado Binary_Death

  • Moderador
  • *****
  • Mensajes: 821
  • Sexo: Masculino
    • Ver Perfil
Re:como hago un loop para convertir de ascii a decimal?
« Respuesta #3 en: Agosto 23, 2013, 11:12:00 am »
Código: (asm) You are not allowed to view links. Register or Login
.386
.model flat, stdcall
option casemap:none
.data
  num       db      "123",0
.code
start:
    lea edi, [num]
    loop_sub:
        sub byte ptr [edi],30h
        inc edi
        cmp byte ptr [edi],0
        jnz loop_sub
        sub edi, offset num
        mov ecx, edi
        mov eax, 01h
        xor edi, edi
    loop_mul:
        push eax
        xor eax, eax
        lea esi, [num+ecx-1]
        mov byte ptr al, [esi]
        mul dword ptr[esp]
        add edi, eax
        pop eax
        mov edx, 0Ah
        mul edx
        loop loop_mul
        mov eax, edi
    end start
 
   

Bueno, lo he pasado a ASM.
Más o menos de la manera que dijo mr.blood. Funciona con números de hasta 32 bits. Si tienes alguna duda sobre el código pregunta.

Como puedes ver, tenemos el string ASCII y lo que hacemos es correr byte por byte y restarle 0x30 (48d) a cada uno, hasta encontrar el fin de la cadena, el byte nulo. Esto a su vez nos servirá para conocer la longitud del string, y la guardamos en ECX, que nos hará de contador para nuestro próximo loop.

En el siguiente bucle recorremos la cadena en sentido contrario (usando ECX como direccionador), multiplicando cada número por una potencia de 10. El último por 10^0, el penúltimo por 10^1.. hasta terminar, es decir, hasta que ECX = 0. A su vez vamos sumando los resultados en EDI.
Al acabar pasamos EDI a EAX para que quede bonito y listo.
« Última modificación: Agosto 23, 2013, 11:44:50 am por Binary_Death »

Desconectado H-BlacK

  • Me das tu IP?
  • *
  • Mensajes: 2
    • Ver Perfil
Re:¿Cómo hago un loop para convertir de ASCII a decimal?
« Respuesta #4 en: ſeptiembre 01, 2013, 12:27:44 pm »
Código: You are not allowed to view links. Register or Login
proc str2uint32,lpszInteger
        push ebx

        mov ebx,[lpszInteger]
        xor eax,eax
        mov ecx,10
@@:
        movzx edx,byte[ebx]
        cmp dl,'9'
        ja @F
        cmp dl,'0'
        jb @F

        lea eax,[eax+eax*4]
        lea eax,[edx+eax*2-'0']
        inc ebx
        loop @B
@@:
        pop ebx
        ret
endp

Desconectado Binary_Death

  • Moderador
  • *****
  • Mensajes: 821
  • Sexo: Masculino
    • Ver Perfil
Re:¿Cómo hago un loop para convertir de ASCII a decimal?
« Respuesta #5 en: ſeptiembre 02, 2013, 09:44:36 pm »
Excelente algoritmo!

Vamos a explicarlo un poco, que será de gran ayuda para proxy_lainux:

Lo que hay que hacer es descomponer la operación de multiplicación por 10 en varias partes.
Como en el primer ciclo del bucle eax es 0 y no tiene gracia, vamos al segundo.

Pongamos que el primer dígito es 0x37, es decir, nuestro 0x37-0x30 = 0x7.
Así pues tenemos ahora el 7 cargado en eax. Vamos al segundo ciclo.

Lo que debemos hacer es fácil, multiplicar 0x7 * 0x0A (10d), y luego sumarle, si por ejemplo el segundo dígito es 0x35 (5 decimal), pues 0x35-0x30

De esa forma nos quedará un perfecto 75d (0x4B).

Pero el problema es multiplicar por 10 de una forma rápida y efectiva, y lo que se hace aquí es descomponer la multiplicación.

Si decimos que:

lea eax, [eax + eax * 4]
eax = eax + eax * 4

Entonces significa que hemos multiplicado eax * 5

Así que ahora tenemos 5 * eax, que multiplicado por 2 = 10 * eax.
lea eax, [eax * 2]

Y si queremos meter todo en una sola operación, pues queda:

lea eax, [eax + eax * 4]
lea eax, [eax * 2 + edx - 30h]

Donde en edx tenemos nuestro siguiente carácter de la cadena.


« Última modificación: ſeptiembre 02, 2013, 11:19:12 pm por Binary_Death »


question
Como convertir numeros a ASCII[ASM]

Iniciado por Mr.T

1 Respuestas
2768 Vistas
Último mensaje Febrero 23, 2011, 05:36:00 pm
por jep
xx
Como hago para convertir mi disco duro interno en externo.

Iniciado por wilberjulio

8 Respuestas
4356 Vistas
Último mensaje Mayo 29, 2008, 10:01:47 am
por mario_1991
resuelto
[Duda] Convertir de hexadecimal a decimal

Iniciado por Mr. X

4 Respuestas
999 Vistas
Último mensaje Enero 21, 2012, 07:36:55 pm
por Mr. X
resuelto
[C++] Convertir de hexadecimal a ascii

Iniciado por Aetsu

3 Respuestas
1692 Vistas
Último mensaje Noviembre 22, 2011, 06:17:42 am
por Avoidance25
exclamation
[Código-C#]Convertir String a ASCII - JaAViEr

Iniciado por JaAViEr

3 Respuestas
4808 Vistas
Último mensaje Mayo 02, 2011, 11:03:56 am
por mDrinky
exclamation
[Código PHP]Función: Convertir texto a ASCII - JaAViEr

Iniciado por JaAViEr

1 Respuestas
3615 Vistas
Último mensaje Abril 23, 2011, 09:26:12 pm
por darkgx
exclamation
como hago para instalar una tarjeta de audio-video para camara

Iniciado por midiann

1 Respuestas
1739 Vistas
Último mensaje Junio 17, 2008, 05:10:27 pm
por rgb90
xx
Como le hago para hackear la pagina de la escuela para modificar las califas?

Iniciado por NT AUTHORITY

3 Respuestas
3719 Vistas
Último mensaje Abril 22, 2012, 10:47:04 am
por cibergolen
xx
Como hago para poner el Bifrost para que no me joda mas con el AVG

Iniciado por SoloAki

5 Respuestas
1702 Vistas
Último mensaje Febrero 09, 2007, 06:43:50 pm
por SoloAki
xx
Como hago para... -->

Iniciado por KrLx

14 Respuestas
2715 Vistas
Último mensaje Diciembre 17, 2007, 02:10:40 pm
por mr/popeye