Bueno, vamos a descubrir si?
Primero escribiré esto en C:
#include
void addAndPrint (int A, int B)
{
printf (“% d \ n”, A + B);
}
- ¿Qué herramientas puedo usar para la alineación de negocios y TI?
- Los autores del ransomware WannaCry han exigido un rescate de $ 300 en Bitcoin. ¿Por qué $ 300? ¿Por qué no $ 250, $ 400 o $ 500?
- ¿Cuál es la mejor tecnología en la industria de TI?
- ¿Cuáles son los conceptos erróneos comunes sobre las supercomputadoras?
- ¿Debo elegir MIT Manipal CSE / IT Branch considerando que nunca he estudiado Informática en mi nivel escolar?
… entonces puedo usar el compilador GNU C para compilarlo en lenguaje ensamblador:
gcc -c -S cprogram.c
… y obtengo un archivo en lenguaje ensamblador llamado ‘cprogram.S’ que se ve así:
.file “cc”
.sección .rodata
.LC0:
.string “% d \ n”
.texto
.globl addAndPrint
.type addAndPrint, @function
addAndPrint:
.LFB0:
.cfi_startproc
pushq% rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq% rsp,% rbp
.cfi_def_cfa_register 6
subq $ 16,% rsp
movl% edi, -4 (% rbp)
movl% esi, -8 (% rbp)
movl -4 (% rbp),% edx
movl -8 (% rbp),% eax
addl% edx,% eax
movl% eax,% esi
movl $ .LC0,% edi
movl $ 0,% eax
llamada printf
nop
salir
.cfi_def_cfa 7, 8
jubilado
.cfi_endproc
.LFE0:
.size addAndPrint,.-addAndPrint
.ident “GCC: (Ubuntu 5.4.0-6ubuntu1 ~ 16.04.4) 5.4.0 20160609”
.sección .note.GNU-stack, “”, @ progbits
La mayor parte de esto se debe al hecho de que tuve que ajustar la línea ‘printf (“% d \ n”, A + B);’ en una función para que pueda compilarlo. El código útil real es solo esto (le agregaré comentarios para que pueda seguirlo de la siguiente manera:
; Primero agregue los dos números:
movl -4 (% rbp),% edx; Copia el valor de A en ‘edx’
movl -8 (% rbp),% eax; Copia el valor de B en ‘eax’
addl% edx,% eax; Agregue edx a eax, (el resultado está en eax)
; Ahora llama ‘printf’ para imprimirlos
movl% eax,% esi; Copia eax en esi
movl $ .LC0,% edi; Ponga la dirección de “% d \ n” en edi
movl $ 0,% eax; Pon $ 0 en eax
llamada printf; Imprime el resultado.
Básicamente, la parte de “agregar dos números” es fácil: hay una instrucción de código de máquina (“addl” para “agregar entero largo”) que lo hace por usted … pero recuperar los dos números desde donde se almacenan requiere dos “movl Comandos ”(mover entero largo).
Los símbolos que comienzan con ‘% e’ son registros: el puñado especial de ubicaciones de memoria que se encuentran en el interior de la CPU, que es donde deben estar los datos para que se realicen operaciones específicas en ella.
El envío real del resultado a la consola está siendo manejado por una función de biblioteca estándar … esto es afortunado porque sin eso, ¡esto sería mucho más trabajo!
Sin una función de biblioteca para hacer eso, tendría que dividir el número en dígitos, convertirlos a ASCII y usar la función de “escritura” del sistema operativo para escribirlos.
Si tuviera que escribir incluso la función de ‘escritura’, acabaría teniendo que volver a escribir el sistema de ventanas, manejar el hardware de gráficos directamente … ¡sería una pesadilla, incluso en código C!