¿Qué significa agregar dos números y escupir el resultado a un dispositivo de salida, como un monitor de PC, en el lenguaje de programación de computadoras de la Asamblea?

Bueno, vamos a descubrir si?

Primero escribiré esto en C:

#include

void addAndPrint (int A, int B)
{
printf (“% d \ n”, A + B);
}

… 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!

En los años 80 y 90, los días en que existían DOS y tecnología de gráficos como VGA y CGA, su tarjeta de video leía los datos directamente de la memoria. Así que había una dirección de memoria reservada que, cuando la escribía directamente, aparecería en la pantalla el correspondiente carácter ASCII. Por lo tanto, sería una cuestión de dividir el valor en sus componentes de base 10, los caracteres individuales feom 0-9 calculan el valor ascii y lo escriben en la dirección de memoria correcta.

Este proceso rápidamente se convirtió en subrutinas de forma fácil y gratuita LLAMADA en ASM. Estas subrutinas se volvieron cada vez más abstractas, se vincularon dinámicamente con el sistema operativo, se convirtieron en controladores que los fabricantes podían construir. Actualmente, la adición de dos enteros sería fácil pero no se podría escribir sin entender su hardware …