Lab 1: Solution Files


; include directives
global asm_main
%include "../lib/"

segment .data
    ; DX directives (read only, static data)
    hello    db    "Hello World! Привет, мир! Сәлем Әлем!¡Hola Mundo!", 0xA, 0
    world    db    "¡Hola Mundo!", 0xA, "नमस्ते दुनिया!", 0xA, "안녕하세요!", 0xA,  "你好", 0xA, "世界!", 0xA, 0

segment .bss
    ; RESX directives (writable data)

segment .text
asm_main:                    ; entry point (called from driver.c)
    ; instructions

    enter 0,0                ; Initialize register EBP
    pusha                    ; Push register contents to the stack
    mov     eax,  hello      ; put hello in EAX
    call    print_string     ; print data in EAX
    mov     eax,  world      ; put world in EAX
    call    print_string     ; print data in EAX
    popa                     ; Restore register data from the stack
    mov eax, 0               ; flush EAX of data
    leave                    ; restore the stack
    ret                      ; Return from main back into C library wrapper


# compiles the project files (hello.asm)
# Compiles dependencies if they are not up to date
hello: asm_io.o driver.o hello.o
    @echo "Building hello.asm"
    @gcc -m32 driver.o hello.o asm_io.o -o hello
    @rm hello.o             # Remove hello.o to force a recompile each time

# Build hello.asm
    @nasm -f elf hello.asm -o hello.o

# Build asm_io.asm
    @nasm -f elf -d ELF_TYPE ../lib/asm_io.asm -o asm_io.o

# Build driver.c
    @gcc -m32 -c ../lib/driver.c -o driver.o

# Clean up and then rebuild all (asm_io.asm, driver.c, and hello.asm)
all: clean hello

# Removes all .o and temporary files
    @echo "Cleaning up..."
    @rm -f *.o
    @rm -f hello