section .data
precio_articulo dd 0
cantidad_comprada dd 0
monto_a_pagar dd 0
descuento dd 0
monto_final dd 0
MSG_PRECIO_ARTICULO db "Ingrese el precio del artículo: ", 0
MSG_CANTIDAD_COMPRADA db "Ingrese la cantidad comprada: ", 0
MSG_MONTO_FINAL db "El monto final a pagar es: ", 0
section .text
global _start
_start:
; Ingresar precio del artículo
mov rdi, MSG_PRECIO_ARTICULO ; Cargar dirección del mensaje en rdi
call imprimir_mensaje
; Leer precio del artículo
mov rsi, precio_articulo ; Cargar dirección de la variable en rsi
call leer_numero
; Ingresar cantidad comprada
mov rdi, MSG_CANTIDAD_COMPRADA ; Cargar dirección del mensaje en rdi
call imprimir_mensaje
; Leer cantidad comprada
mov rsi, cantidad_comprada ; Cargar dirección de la variable en rsi
call leer_numero
; Calcular monto a pagar antes de descuento
mov eax, dword [precio_articulo] ; Cargar precio_articulo en eax
imul eax, dword [cantidad_comprada] ; Multiplicar precio por cantidad
mov dword [monto_a_pagar], eax ; Guardar resultado en monto_a_pagar
; Calcular descuento
mov eax, dword [descuento] ; Cargar valor de descuento en eax
sub dword [monto_a_pagar], eax ; Restar descuento al monto a pagar
test eax, eax ; Comprobar si el monto a pagar es menor o igual a 0
jle fin_descuento
; Calcular monto final
mov eax, dword [monto_a_pagar] ; Cargar monto_a_pagar en eax
fin_descuento:
; Imprimir monto final
mov rdi, MSG_MONTO_FINAL ; Cargar dirección del mensaje en rdi
call imprimir_mensaje
mov rsi, monto_final ; Cargar dirección de la variable en rsi
call imprimir_numero
; Finalizar programa
mov eax, 60 ; Salir con syscall exit
xor edi, edi ; Código de éxito
syscall
imprimir_mensaje:
; Función para imprimir un mensaje
mov rax, 0x1 ; Llamada al sistema para escribir en la salida estándar
mov rdx, 0xFFFFFFFF ; Longitud máxima del mensaje
syscall
ret
leer_numero:
; Función para leer un número
mov rax, 0 ; Llamada al sistema para leer de la entrada estándar
mov rdx, 0xFFFFFFFF ; Longitud máxima del número
syscall
ret
imprimir_numero:
; Función para imprimir un número
mov rax, 0x1 ; Llamada al sistema para escribir en la salida estándar
mov rdx, 0xFFFFFFFF ; Longitud máxima del número
syscall
ret