Está en la página 1de 60

Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

3. Representación de programas en Intel x86-64


Sistemas Computacionales

Christian Vega

Universidad de Concepción
Departamento de Ingeniería Eléctrica

3 de junio de 2020

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 1 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Agenda

1 Introducción

2 Arquitecturas de 32 bits

3 Arquitecturas de 64 bits

4 Formato de Programas

5 Instrucciones básicas

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 2 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Arquitectura de un computador

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 3 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Tool-chain para generación de un programa

Figura 1: Sistema de Compilación

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 4 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Representación de programas

Programador escribe código fuente


Lenguajes de alto nivel:Java, Python, PHP, C++, etc.
Lenguajes de nivel intermedio: C (Mayor interacción
con la memoria).
Lenguaje de bajo nivel: ensamblador
Computador entiende lenguaje de máquina. Sólo
0s y 1s.
Compilador y/o traductor realizan la conversión
entre código fuente y código de máquina

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 5 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Representación de programas

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 6 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Lenguaje Ensamblador

Es un lenguaje de bajo nivel que provee una interfaz a la base


de instrucciones al procesador del sistema computacional.
Abstrae los recursos del sistema computacional al
programador.
Acceder a la memoria, operaciones del procesador, interfaces
de hardware y registros del procesador.
Conocimiento profundo de como el procesador y la memoria
trabajan.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 7 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

¿Por qué aprender ensamblador?

Saber cómo el código fuente se transforma en lenguaje de máquina


ayuda a:
Entender qué hace el compilador.
Entender cómo optimizar el código fuente.
Detectar ineficiencias en el código fuente.
Entender cómo funciona un sistema computacional.
La programación de bajo nivel es requerida en dispositivos de
red e IoT.
Mejorar habilidades para el desarrollo de algoritmos.
Entender el llamado a funciones o procedimientos.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 8 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Algo de historia

1968 1969
Fundación Fundación
1974 1975
8080 (8 bits datos 16 AMD 9080
direcciones, modo (copia del 8080)
real)

1978
8086 (16 bits,
modo real)
1982
IA 32
80286 (16 bits,
modo protegido)

1985
i386 (32 bits,
modo protegido)
1991-2003
1989-2008 AMD 386
i486/Pentium/ (32 K5/K6/Duron/Sempron
x86-64
bits)
2005
2009 AMD64
serie Dual-core Athlon
i3/i5/i7(extendido 64x2/Phenom/AthlonII,
64 bits, multicore, PhenomII/ ......A10/A12
multihilo)

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 9 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

¿Qué es visible para el programador en ensamblador?

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 10 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

¿Qué es visible para el programador

PC: Contador de programa %eip(IA32) o %rip(x86-64).


Registro: Registros de 32 o 64 bits, contiene datos
temporales, para almacenar datos temporales, de rápido
acceso para la CPU.
Bits de condición (flags): Estos dependen de las
operaciones aritméticas más recientes.
Instrucciones: set de instrucciones, depende de la
arquitectura (sumar, mover, desplazar....).
Memoria: Un gran arreglo de bytes direccionable.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 11 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Diferencias entre Arquitecturas

int sum(int x, int y){


int t = x + y;
return t;}
$ gcc -m32 -S code.c $ gcc -m64 -S code.c

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 12 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Familia de CPUs Intel

Familia de CPU’s desarrolladas por Intel que son la base


de los PCs.
Intel 8088(1980) a Intel i9(2018)
Procesadores de la familia x86.
Tienen un conjunto básico común de registros.
Tienen un conjunto básico común de instrucciones.
Mantienen la arquitectura del conjunto de
instrucciones (ISA, Instruction Set Architecture).

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 13 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Arquitectura Intel x86

Arquitectura derivada de la CPU 8086.


Procesador de 16 bits que comenzó la familia Intel x86.
La versión 8088 fue usada en primer computador IBM-PC.
Registros y ALU de 16 bits
Direcciones de memoria de 20 bits
Direcciona 1 MiB de RAM!
Pipeline de 2 etapas

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 14 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Registros 8088

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 15 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Bits de Condición - Status

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 16 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Arquitectura x86 de 32 bits

Arquitectura de conjunto de instrucciones Intel


IA32.
Conocida como Intel x86 de 32 bits.
Extiende arquitectura de 16 bits del 8086.
Introducida en 1985 con Intel 80386.
Limitaciones de arquitectura de 32 bits
Espacio de direcciones virtual de 4 GiB.
Tamaño máximo de archivo de 4 GiB.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 17 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Registros IA-32

Registros enteros.Almacenan
datos y direcciones
8 registros de 32 bits. Ej.
Registro %eax
Accesibles como 8 registros
de 16 bits. Registro %ax.
Los 4 primeros son
accesibles como bytes.
Registros %ah y %al

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 18 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Arquitecturas de 64 bits

DEC Alpha de 64 bits (1992)


Sun SPARC de 64 bits (1995)
Intel Itanium (2001- IA64)
Desarrollada en conjunto con HP 10M transistores.
Usa VLIW (Very Long Instruction Word).
No es compatible con código IA32 existente.
Arquitectura de difícil implementación.
No tiene el desempeño esperado.
Intentos de mejora: Itanium 2 (2004), Itanium 2 - Dual Core
(2006).
AMD se adelanta a Intel en sacar una arquitectura de 64 bits
compatible con x86.
Nace la arquitectura AMD X86-64, la cual luego es integrada
por Intel con la denominación EMT64.
C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 19 / 60
Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Arquitectura AMD x86-64

Características
Punteros de 64 bits.
Enteros long int de 64 bits.
Operaciones enteras de 8, 16, 32 y 64 bits.
16 registros de propósito general.
Operaciones condicionales.
Nuevas instrucciones para operaciones de punto flotante.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 20 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Tipos de datos x86-64

Punteros de 8 bytes (64 bits) permiten direccionar 264


bytes (16 exabytes) de memoria.
Procesadores Intel y AMD actuales sólo direccionan 248 (256
terabytes) de RAM física
Datos long double usan 16 bytes para almacenar números
de punto flotante en formato de 80 bits.
Sólo se usan 10 bytes menos significativos.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 21 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Tipos de datos en ensamblador

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 22 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Registros x86-64

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 23 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Estructura de un programa ensamblador

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 24 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Estructura de un problema ensamblador

Directivas: Le dicen al ensamblador "qué hacer". Declarar


inicio, secciones de código, procedimientos, entre otros.
Instrucciones: Le dice a la CPU "qué hacer".
Operandos: argumentos para directivas e instrucciones.
Secciones: Partes de un código ensamblador:
.data: Inicialización de variables y constantes.
.text: Instrucciones del código ensamblador.
.bss: datos no inicializados.
Labels: Etiquetas para organizar el código.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 25 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Formato de Programas en Ensamblador

Comentarios: Utilizar el punto y coma (;) semicolon. Después


de ; todos los caracteres son ignorados por el ensamblador.
Valores numéricos
Decimal: Ninguna notación especial es requerida.
Hexadecimal: Iniciar con 0x. Ejemplo: 255 = 0xFF
Octal: Finalizar con la letra q. Ej. 777q.
Definición de Constantes
Siguen el formato <name> equ <value>
Ej. SIZE equ 10000
El valor la constante no puede cambiar durante la ejecución del
programa.
Tener cuidado con la limitación en los rangos de memoria.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 26 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Data Section

Sección donde se declaran los datos inicializados.


Formato: <variableName> <dataType> <initialValue>

Tipo de Variable Longitud


db 8-bit
dw 16-bit
dd 32-bit
dq 64-bit
ddq 128-bit (integer)
dt 128-bit (float)

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 27 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

BSS Section

Variables no inicializadas. Es una reserva de memoria para ser


ocupada posteriormente. Ej. inicialilzar un vector.
Formato: <variableName> <resType> <count>

<resType> Longitud
resb 8-bit
resw 16-bit
resd 32-bit
resq 64-bit
resdq 128-bit

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 28 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Text Section

Es el lugar donde reside el código.


Instrucciones a la abstracción de la máquina (memoria, CPU,
registros, stack)
Para iniciar el código se debe incluir la directiva global.
global _ start
_ start:
Para finalizar el código y liberar los recursos.
mov rax, 60
mov rdi, 0
syscall
mov rax, SYS_ exit
mov rdi, EXIT_SUCCESS
syscall
C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 29 / 60
Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Ensamble - Enlazamiento - Carga (Tool - Chain)

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 30 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Tool - Chain - Ensamblaje

Ensamble: Convertir el código de lenguaje ensamblador a


lenguaje de máquina (objeto reubicable). Se eliminan los
comentarios, y los nombres y etiquetas son reemplazadas en
direcciones apropiadas, como lo requiere la CPU durante su
ejecución.
List File. Incluye información de áreas de memoria y código de
máquina para cada instrucción (útil para hacer depuración).

No. Dirección Código de


de Código Ensamblador
Linea Máquina
Memoria

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 31 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Tool - Chain - Ensamblaje II

Cuando se incluyen instrucciones, se presenta la dirección de


memoria relativa para almacenar la instrucción y el código de
máquina que implica esa instrucción.
Etiquetas labels y directrices no formarán parte del código de
máquina.

No. Dirección Código de


de Código Ensamblador
Linea Máquina
Memoria

yasm -g dwarf2 -f elf64 example.asm - l example.lst


C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 32 / 60
Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Tool- Chain - Enlazamiento

En en el enlazamiento se procesan los objetos reubicables en


un único archivo ejecutable.
En el proceso se agregan librerías de ser necesario.
Para el caso de enlazar un sólo objeto:
ld -g -o example example.o
Para enlazar múltiples objetos:
ld -g -o example main.o funcs.o

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 33 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Tool-Chain - Enlazamiento

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 34 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Carga

La carga corresponde al proceso de llevar el programa desde la


unidad de almacenamiento a la memoria principal.
El cargador loader Encuentra, lee, crea un nuevo proceso,
carga el código de programa en la memoria y marca el
programa como listo para ejecución.
El planificador del sistema operativo operating-system
scheduler toma decisiones sobre cuando el proceso es
ejecutado.
./example

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 35 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Depuración - Debugging

Control de la ejecución del programa.


Permite testear el código.
Identificar el almacenamiento en memoria.
Para poder hacer depuración debugger es necesario la opción
-g en el ensamblaje y enlazamiento.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 36 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Depuración

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 37 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Movimiento de datos

Mover información entre el registro y la memoria RAM. La


forma general de la instrucción move es:
mov <dest>, <src>

El indicador explicito dword, puede ser reemplazado por:


byte (8 bits)
word (16 bits)
dword (32 bits)
qword (64 bits)
C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 38 / 60
Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Consideraciones

Los dos operandos no pueden ser memoria (Siempre hay que


pasar primero por el registro).
mov rax, dword[myVariable] (Permitido)
mov qword[qVar2], qword[qVar1] (No permitido)
El operando de destino no puede ser un valor inmediato.
mov rax, 89 (Permitido)
mov 89, rax (No permitido)
Para una instrucción con origen y destino dword la porción
más significativa del registro qword asociado se hace cero.
Direccionamiento
mov rax qword[var1]; valor de var1 en rax.
mov rax, var1; dirección de var1 en rax.
Debe existir coherencia entre el tamaño del origen y el destino.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 39 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Truncamiento

Convertir un tipo de dato de mayor longitud a uno de menor


longitud. Responsabilidad del programador que el
truncamiento sea válido.
Ej. truncar los últimos 8 bits del valor almacenado en rax y
almacenarlo en la variable tipo byte bVal.
mov rax, 50
mov byte[bVal], al
¿Qué pasa si?:
mov rax, 500
mov byte[bVal], al

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 40 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Ensanchamiento I

Son conversiones de un tipo de dato de menor longitud a uno de


mayor longitud. Dado que el tamaño se expande los bits más
significativos deben ser asignados de acuerdo al signo del valor
original.
Conversiones sin signo:
Opción 1 mov al, 50
mov rbx, 0
mov bl, al
Opción 2
mov al, 50
movzx rbx, al

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 41 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Instrucción movzx

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 42 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Ensanchamiento II

Para conversiones con signo los bits más significativos deben


ser asignados como ceros o unos dependiendo si el valor
original es positivo o negativo.

Instrucciones generalizadas
movsx dest, src
movsxd dest, src

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 43 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Ensanchamiento III

Posibilidades con movsx y movsxd

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 44 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Operaciones Matemáticas

Empleadas para manipular matemáticamente los registros.


Siguen el formato:
operation register, value/register
El resultado de la operación se almacena en el primer
operando
add rax, 5; rax = rax + 5
sub rbx, rax; rbx = rbx -rax

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 45 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Operaciones Matemáticas

Operación Operación (signed) Descripción


add a, b - a = a+b
sub a, b - a = a-b
mul reg imul reg rax = rax*reg
div reg idiv reg rax = rax/reg
neg reg - reg = -reg
inc reg - reg = reg +1
dec reg - reg = reg -1
adc a,b - a = a+b+CF
sbb a,b - a= a-b-CF

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 46 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Suma con carry bit

Instrucción adc
adc dest, src
dest = dest + src + carry

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 47 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Consideraciones para la Multiplicación

Instrucciones mul e imul

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 48 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Consideraciones para la división

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 49 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Consideraciones para la división II

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 50 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Operaciones Lógicas

Las operaciones se realizan bit a bit.


and dest, src
or dest, src
xor dest, src
not op

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 51 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Operaciones de desplazamiento I

Desplazamiento lógico a la izquierda:


shl dest, imm
shl dest, cl
Desplazamiento lógico a la derecha:
shr dest, imm
shr dest, cl

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 52 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Operaciones de desplazamiento II

Desplazamiento aritmético a la izquierda:


sal dest, imm
sal dest, cl
Desplazamiento aritmético a la derecha:
sar dest, imm
sar dest, cl

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 53 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Instrucciones de rotación

Rotación a la izquierda:
rol dest, imm
rol dest, cl
Rotación a la derecha:
ror dest, imm
ror dest, cl

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 54 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Flujo del programa

Todos los códigos tienen un


flujo por defecto que va
desde arriba a abajo.
El registro rip almacena la
dirección de la siguiente
instrucción a ser ejecutada.
Después de cada instrucción
se incrementa en 1,
estableciendo de forma
natural el flujo del programa.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 55 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Saltos

Pueden ser usados para saltar a diferentes partes del código


identificadas con etiquetas.
Se usan para cambiar el flujo del programa.
formato: jmp label
Carga el valor "label"dentro del registro rip.
Ejemplo:
_start:
jmp _start

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 56 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Comparaciones

Permiten tomar decisiones de control de flujo.


Comparaciones entre registros o registro y operando $Imm
formato: cmp registro, registro/valor
Ejemplo:
cmp rax, 23
cmp rax, rbx
Después de la comparación los flags:
a == b, ZF=1
a != b, ZF = 0
SF = msb(a-b)

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 57 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Saltos Condicionales

Salto Salto Resultado


(signed) (unsigned) cmp a,b
je - a ==b
jne - a !=b
jg ja a>b
jge jae a>=b
jl jb a<b
jle jbe a<b
jz - a ==0
jnz - a!=0
j0 - Overflow
jno - No Overflow
ja - Jump if signed
jns - Jump if not signed
C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 58 / 60
Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Saltos condicionales

Ejemplo 1:
cmp rax, 23
je _condicion1
El programa saltara a la dirección de la etiqueta _condicion1
si y solo si el valor en rax es igual 23.
Ejemplo 2:
cmp rax, rbx
jg _condicion2
El programa saltara a la dirección de la etiqueta _condicion2 si
y solo si el valor en rax es superior al valor almacenado en rbx.

C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 59 / 60


Introducción Arquitecturas de 32 bits Arquitecturas de 64 bits Formato de Programas Instrucciones básicas

Referencias

Texto Guía: Jorgenson, E.


(2019). X86-64 Assembly
Language Programming with
Ubuntu.
YASM - Documentación
Oficial: https:
//yasm.tortall.net/
Ensamblador Y-ASM
(Online) https://www.
tutorialspoint.com/
compile_yasm_online.php
Cambiar comando a:
yasm -f elf64 *.asm; ld -o demo
*.o
C. Vega Departamento de Ingeniería Eléctrica 3 de junio de 2020 60 / 60

También podría gustarte