; uso de equ para definir valores

STDIN equ 0
STDOUT equ 1
STDERR equ 2

SYS_READ equ 0
SYS_WRITE equ 1
SYS_EXIT equ 60

; definimos en cajitas las direcciones del texto
; usamos la caja msg y msg2 para guardar los strings
; el 0 al final del texto es para determinar cuando termina

section .data
    msg db "Hello world!",10,0
    msg2 db "mundo dos",10,0
    msg3 db "stop",10,0

; inicio del codigo



section .text
    global _start

; macro: practicamente es definir una funcion

%macro exit 0
    mov rax, SYS_EXIT
    mov rdi, 0
    syscall
%endmacro

; ejecucion de todas las funciones e instrucciones

_start:
    mov rax, msg
    call _print
    mov rax, msg2
    call _print
    mov rax, msg3
    call _print
    exit

; input: rax como puntero en un string
; output: imprimir el string de rax
; se define la funcion que se utilizara para imprimir texto y
; contar los caracteres

_print:
    push rax
    mov rbx, 0
    
; el bucle que cuenta los caracteres
; cuando copia el valor de rax en cl, compara si es igual a 0
; se hace un salto si no son iguales y se repite todo,
; si son iguales, se acaba el bucle

_printLoop:
    inc rax
    inc rbx
    mov cl, [rax]
    cmp cl, 0
    jne _printLoop
    mov rax, SYS_WRITE
    mov rdi, STDOUT
    pop rsi
    mov rdx, rbx
    syscall
    ret

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: