PREGUNTAS CONCRETAS SOBRE ENSAMBLADOR LINUX/IA-32/GAS/BINUTILS

Iniciado por ADMIRATION, 23 Enero 2014, 14:21 PM

0 Miembros y 4 Visitantes están viendo este tema.

ADMIRATION

Sobre curso de introduccion al lenguaje ensamblador:
S.O: Ubuntu 12.10, Arquitectura a estudiar: IA-32, Ensamblador: Gas, Compilador: GCC(binutils, de serie).
1ª Pregunta: Sobre el tamaño de los tipos de datos, ¿es posible declararlos en Python en lugar de en C? (http://learnassembler.com/IA32esp.html)
Desde mi desconocimiento total del tema, estoy empezando en este mundo y durante este curso me van surgiendo preguntas que pueden ayudar a otras personas usando la misma plataforma y herramientas que yo. Agradeceria me fueran contestanto a este hilo.
NO CONTESTAR PARA OTRAS PLATAFORMAS Y S.O PARA SALVAGUARDAR EL CARACTER CONCISO DE ESTE HILO.
Muchas gracias de antemano
No muerdas la mano de quien te cuida, te mima y te da de comer. ¡¡NO LO MERECE!!

cpu2

A ver no se entiende tu pregunta, pero no estas en ASM para que preguntas en python y C.

Ademas esa tabla esta equivocada yo no la miraria mucho para un double o .quad el sufijo es q.

Un saludo.

Slava_TZD

Cita de: cpu2 en 24 Enero 2014, 20:10 PM
A ver no se entiende tu pregunta, pero no estas en ASM para que preguntas en python y C.

Ademas esa tabla esta equivocada yo no la miraria mucho para un double o .quad el sufijo es q.

Un saludo.

La tabla está bien, se refiere a números con coma flotante.

Al op, yo tampoco entiendo la pregunta xD


The fact is, even if you were to stop bombing us, imprisoning us, torturing us, vilifying us, and usurping our lands, we would continue to hate you because our primary reason for hating you will not cease to exist until you embrace Islam.

cpu2

Cita de: Tzhed\ Kyperf/ en 24 Enero 2014, 21:13 PM
La tabla está bien, se refiere a números con coma flotante.

Al op, yo tampoco entiendo la pregunta xD

Para mover un double "ocho bytes", no tiene porque ser un numero de coma flotante se usa el subijo q

Código (asm) [Seleccionar]
movq %rax, (%rsp) ; double
movl %eax, (%rsp) ; long


A lo mejor es que no entiendo bien la tabla, es igual yo me entiendo jeje.


@ADMIRATION

Vale quieres decir que te pasemos las declaraciones que estan en C a python?

Si es eso no hace falta, tienes que cambiar el chip, en ASM (GAS) esas declaraciones no existen, bueno mentira hay algunas declaraciones que tienen practicamnete el mismo nombre. Bueno mejor llama a declaraciones directivas.

Las tienes en el link que te pase de as.

.byte    b  ; 1 byte
.word    w  ; 2 byte
.long    l  ; 4 byte
.quad    q  ; 8 byte
.octa       ;16 byte  ; xmm registro


Depende de si tabajas con numeros de coma flotante tienes que usar otras instrucciones y no hace falta el prefijo, seguro que Tzhed\ Kyperf/  se referia a eso.

Los registros se asemejan a esas directivas, ya veras cuando avances, tambien existe un registro de 32 byte ymm, y los zmm 64 byte, depende de la CPU. No se si hay directivas para esos dos.

Un saludo.

ADMIRATION


Declaración en C   Tipos de datos en IA-32   Sufijo de gas   Tamaño (en bytes)
char   byte   b   1
short   palabra   w   2
int   doble palabra   l   4
unsigned   doble palabra   l   4
long int   doble palabra   l   4
unsigned long   doble palabra   l   4
char*   doble palabra   l   4
float   precisión simple   s   4
double   precisión doble   l   8
long double   precisión extendida   t   12
A la columna de la izquierda me referia. Claro que estudio ASM, pero entonces: ¿que sentido tiene dicha columna que se titula: DECLARACION EN C?
Porque esta columna no me la he inventado yo, sino que esta plasmada en el link de assembler.com que dedica un curso a ensamblador.
Solo intento buscar el sentido de la informacion que recibo.
2ª Pregunta: Respecto al codigo "hello world en ensamblador gas del link:http://www.tldp.org/HOWTO/Assembly-HOWTO/hello.html.
Queriendo entender el codigo:
         1).text                           # section declaration

                                   # we must export the entry point to the ELF 2)linker or
   3) .global _start              # loader. They conventionally recognize _start as their
                                   # entry point. Use ld -e foo to override the default.

4)_start:
                       # write our string to stdout

5)       movl    $len,%edx           # third argument: message length
6)     movl    $msg,%ecx           # second argument: pointer to message to write
7)     movl    $1,%ebx             # first argument: file handle (stdout)
8)     movl    $4,%eax             # system call number (sys_write)
9)     int     $0x80               # call kernel

                                # and exit

10)     movl    $0,%ebx             # first argument: exit code
     movl    $1,%eax             # system call number (sys_exit)
11)     int     $0x80               # call kernel

12).data                           # section declaration

13)msg:
14)   .ascii    "Hello, world!\n"   # our dear string
15)   len = . - msg                 # length of our dear string
Enumeradas todas las lineas del codigo:
¿que funcion realizan cada una, empezando por la 1).text?
Espero que vuestras respuestas le sirvan a las personas prncipiantes como yo a familiarizarse con el codigo.
Gracias cpu2 y Tzhed\ Kyperf/
No muerdas la mano de quien te cuida, te mima y te da de comer. ¡¡NO LO MERECE!!

cpu2

Pues para tener una referencia nada mas, pero esas declaraciones de C no te sirven para nada.

A ver, te explico de forma basta, si quieres saber mas lee los manuales como te dije.

.text y .data: Los programas se dividen en secciones, .text es la que contiene las instrucciones (opcodes) bueno tambien puedes cargar opcode en otras secciones como data pero eso ya es otra cosa, estas secciones algunas tienen permisos como de escritura y lectura, por ejemplo la .text solo puedes leerla pero no escribirla. La .data como dice su nombre es para almacenar datos, esta puede escribirse y leerse.

Depende de la sección que utilices tendra un offset o otro, ya que usas linux podrias usar readelf y algo con objdump, para mirar esas direcciones y permisos. Si quieres saber con mas profundidad ya sabes.

.globl es una directiva que le dice al linker por que offset empezar.

https://sourceware.org/binutils/docs/as/Global.html#Global

No miraste el link.

Y las instrucciones lo unico que hacen es pasar los parametros a una funcion de C alojada en el kernel, en este caso write y exit, tienes que leer el man de esas funciones, para saber que pasar a los parametros.

Deja bien claro lo que hace al lado, esfuerzate mas. Los de .data lo solucionas leyendo el man de as.

Un saludo.

ADMIRATION

No dudes que lo he mirado, y leído y reeleido. Lo único es que me falta relacionarme con el código, voy muy perdido aun. No tengo claro aun el tipo de instrucciones. Para que sirven, en que parte se escribe.
PERO SEGUIRE LEYENDO, Y ESTUDIANDO CADA PARTE DEL CODIGO Y INFORMANDOME DE QUE ES LO QUE HACE CADA LINEA, ASI COMO LAS INSTRUCCIONES Y LOS TIPOS DE DATOS.
Cosas que tenia claras en Python y que aquí me hace falta descubrir.
Gracias y saludos cpu2.
No muerdas la mano de quien te cuida, te mima y te da de comer. ¡¡NO LO MERECE!!

cpu2

Solo me dio la sensacion de que no te mirastes el manual.

Lo unico que hace ese codigo es pasar argumentos y llamar a funciones del kernel. La instruccion mov "mover" el nombre engaña no mueve copia, es una instruccion esencial, basicamente es eso lo que hace, pero si te vas a los manuales de intel veras que esta mejor explicada.

La instruccon int es mas compleja, carga el numero de la funcion en %eax, y transfiere al vector 0x80 "vale para mas vectores", que es el que usa linux para las llamadas, pero para entenderla mejor tendrias que saber para que sirve la IDT y todo eso, yo aun no lo tengo muy claro.

Un saludo.

ADMIRATION

Gracias por la aclaracion de la columna de la izquierda cpu2, ya me quedan los conceptos algo mas claros, y el link ultimo sobre .global del as y las otras me va ayudando a aclarar conceptos, aunque tengo aun muchisimo que aclarar. Pero voy de camino.
Por eso en la pagina de gas del codigo "hellow world", me moleste en enumerar el codigo linea a linea: Para que miembros con tu nivel de ensamblador y que hayan tocado esta plataforma en concreto, fueran describiendo poco a poco el desarrollo de cada linea. No hacia falta describirlas todas a la vez, sino a medida que algun miembro estuviera inspirado, para ir siguiendo el hilo, ¿me entiendes?
Para ayudar a personas como yo que empiezan aqui desde cero, a irse familiarizando un poco mas con el codigo y su estructura.
Las ultimas referencias que das me ayudan mucho.
Gracias cpu2, un saludo.
No muerdas la mano de quien te cuida, te mima y te da de comer. ¡¡NO LO MERECE!!

ADMIRATION

Pregunta sobre este, mi primer codigo en asm/gas/x86/intel,  para ponerlo en practica:
Abro consola ubuntu e invoco escribiendo:

$ as
Sigo con el código:
$ .section .data.                                                                      #declaro la variable "message"                                                           
message: db .ascii "esta es una linea de texto ,0dh ,0ah y esta es otra" , 0
#Desde aquí finalizo codigo
movl $1, %eax
movl $0, %ebx
int $0×80

¿deberia haberlo escrito en editor de texto con el resultado de la lectura de la frase?
¿que errores he cometido?
¿el resultado que genera este código es la lectura de esta frase con retorno de carro como indican los símbolos hexadecimales 0dh y 0ah?
Perdonen mi torpeza y mis confusiones pero soy noob e intento aprender paso a paso este fascinante pero confuso lenguaje

No muerdas la mano de quien te cuida, te mima y te da de comer. ¡¡NO LO MERECE!!