Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ivancea96 en 12 Julio 2013, 04:55 am



Título: Operator+ Original. ¿Cómo?
Publicado por: ivancea96 en 12 Julio 2013, 04:55 am
Mi pregunta es más que nada por curiosidad. El operador "+" de enteros por ejemplo, ¿cómo está definido de raiz? ¿O es una función ya a bajo nivel?
Por ejemplo, el operador * podría ser un bucle for, sumando "a" veces "b".
¿Pero el "+"?


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: eferion en 12 Julio 2013, 09:14 am
Es una función propia del lenguaje. Tu piensa que al final el código fuente que tu escribes se acaba transformando en instrucciones máquina... y cualquier procesador de ordenador tiene instrucciones para ( por ejemplo ) sumar y restar números con signo y sin signo.

Esto quiere decir que no se requiere implementar una función para que sume dos números enteros porque es una funcionalidad que ya viene implementada a más bajo nivel.


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: engel lex en 12 Julio 2013, 09:49 am
en realidad tambien me da curiosidad y me gustaria saber exactamente... cuando sumo 2 numeros enteros, la operacion de ensamblador se resume a una sola instruccion de suma a bajo nivel? o hace más que eso?


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: eferion en 12 Julio 2013, 10:00 am
pues más o menos sería así

Código
  1. int result = num1 + num2;

Código
  1. mov ax, num1
  2. mov bx, num2
  3. add ax, bx
  4. mov result, ax



Título: Re: Operator+ Original. ¿Cómo?
Publicado por: eferion en 12 Julio 2013, 10:03 am
La explicación al por qué de las 4 instrucciones es la siguiente:

Dependiendo de la arquitectura del procesador, no todas las instrucciones pueden acceder a la memoria.

un ejemplo es el caso de las instrucciones de suma, resta, ... Estas instrucciones únicamente pueden operar con los registros del procesador y con valores constantes. Es necesario, por tanto, mover las dos variables a registros del procesador para poder realizar la suma.

La instrucción de suma almacena en ax el resultado de la suma, por lo que después es necesario mover dicho resultado a la variable donde queremos almacenarlo.


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: Danyfirex en 12 Julio 2013, 14:25 pm
Puedes hacer una multiplicación la compilas y la ves en ollydbg.

saludos


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: ivancea96 en 12 Julio 2013, 15:47 pm
mm Danyfirex, buena idea jaja.

Gracias Eferion. Pensaba que sería un poco a más alto nivel el operator +.

¿Y el operator *? ¿Es a bajo nivel, o un conjunto de operators +?


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: Danyfirex en 12 Julio 2013, 16:06 pm
la verdad no he mirado nunca una multiplicacion en ollydbg pero creo que usa las instrucciones MUL,IMUL entre otros.


http://es.wikipedia.org/wiki/Anexo:Listados_de_instrucciones_x86


saludos


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: Oblivi0n en 12 Julio 2013, 16:36 pm
A bajo nivel, la suma la realiza la ALU, aquí tienes el circuíto que la realizaría (lo han complicao un poco xD)

(http://1.bp.blogspot.com/-DhQmQEhCv_E/UIVI3pAnh8I/AAAAAAAAABI/7OIJV8NaTpI/s1600/sumador.JPG)


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: ivancea96 en 12 Julio 2013, 16:55 pm
Mm oblivion, no me he parado mucho en el circuito jeje pero gracias por la respuesta tan detallada xD
Pero yo me refería más a nivel software, no hardware jaja
Pero gracias igual :D (Que tiempos de hacer circuitos en electronica, y luego hacerlos en el minecraft jaja)


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: 0xDani en 14 Julio 2013, 00:03 am
@eferion, en el código ensamblador no te olvides de desreferenciar la memoria usando los brackets ('[', ']').


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: amchacon en 14 Julio 2013, 00:17 am
mm Danyfirex, buena idea jaja.

Gracias Eferion. Pensaba que sería un poco a más alto nivel el operator +.

¿Y el operator *? ¿Es a bajo nivel, o un conjunto de operators +?
La multriplicación puede implementatse vía hardware, la unica que no se puede implementar es la división (y aun asi, creo que la cpu puede hacerla internamente vía software interno).


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: xv0 en 14 Julio 2013, 00:18 am
un ejemplo es el caso de las instrucciones de suma, resta, ... Estas instrucciones únicamente pueden operar con los registros del procesador y con valores constantes. Es necesario, por tanto, mover las dos variables a registros del procesador para poder realizar la suma.

add y sub pueden trabajar directamente con la memoria.

Código
  1. pushq $0x1
  2. addb $0x2, (%rsp)
  3. popq %rax

Un saludo.


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: eferion en 16 Julio 2013, 22:35 pm
@eferion, en el código ensamblador no te olvides de desreferenciar la memoria usando los brackets ('[', ']').

Era un ejemplo rápido... también me podrías haber dicho que no reservé espacio para la pila ni inicialicé correctamente la aplicación XD


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: 0xDani en 17 Julio 2013, 00:09 am
Era un ejemplo rápido... también me podrías haber dicho que no reservé espacio para la pila ni inicialicé correctamente la aplicación XD

Entiendo que era un trozo del código, una cosa es que el código no esté completo y otra es que lo que pongas no esté bien.

De todas formas, ya que lo dije no estaría de más editar el mensaje... digo yo que cuanto mejor esté, pues mejor no?


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: eferion en 17 Julio 2013, 08:07 am
Entiendo que era un trozo del código, una cosa es que el código no esté completo y otra es que lo que pongas no esté bien.

De todas formas, ya que lo dije no estaría de más editar el mensaje... digo yo que cuanto mejor esté, pues mejor no?

He estado dando vueltas a lo de los corchetes y hasta donde llego eso es para manejar punteros, me equivoco?

Yo no he usado punteros sino variables normales luego no veo que cabida tienen los corchetes... si me equivoco házmelo saber que hace algunos añitos que no toco ensamblador.

Un saludo.


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: 0xDani en 17 Julio 2013, 14:49 pm
He estado dando vueltas a lo de los corchetes y hasta donde llego eso es para manejar punteros, me equivoco?

Yo no he usado punteros sino variables normales luego no veo que cabida tienen los corchetes... si me equivoco házmelo saber que hace algunos añitos que no toco ensamblador.

Un saludo.

A ver, si le das un identificador a la variable, es porque la has declarado así:

Código
  1. num1: dd 5
  2. num2: dd 7
  3. result: dd 0
  4.  

De esta forma, tanto num1, como num2 como result son punteros, y hay que desreferenciarlos para acceder a la variable.

Saludos.


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: eferion en 17 Julio 2013, 15:13 pm
A ver, si le das un identificador a la variable, es porque la has declarado así:

Código
  1. num1: dd 5
  2. num2: dd 7
  3. result: dd 0
  4.  

De esta forma, tanto num1, como num2 como result son punteros, y hay que desreferenciarlos para acceder a la variable.

Saludos.


Vale, ya entendí.

Cuando escribí el código estaba pensando en algo más básico, tal que...

Código
  1.  
  2. num1 WORD 124h
  3. num2 WORD 3120h
  4. result WORD 0h
  5.  
  6. ; ...
  7.  
  8. mov ax, num1
  9. mov bx, num2
  10. add ax, bx
  11. mov result, ax

Por eso no me cuadraba lo de desreferenciar la memoria.


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: ivancea96 en 17 Julio 2013, 15:46 pm
Venga, el código se entendió, gracias a todos por los comentarios.


Título: Re: Operator+ Original. ¿Cómo?
Publicado por: eferion en 17 Julio 2013, 15:54 pm
Venga, el código se entendió, gracias a todos por los comentarios.

jajajajaja deja deja, que yo así también recuerdo cosas olvidadas :)