External include files
This commit is contained in:
1
Makefile
1
Makefile
@@ -1,6 +1,7 @@
|
|||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
SRC := $(wildcard *.asm)
|
SRC := $(wildcard *.asm)
|
||||||
|
SRC := $(filter-out functions.asm, $(SRC))
|
||||||
OBJDIR := build
|
OBJDIR := build
|
||||||
OBJS := $(SRC:%.asm=$(OBJDIR)/%.o)
|
OBJS := $(SRC:%.asm=$(OBJDIR)/%.o)
|
||||||
BINS := $(SRC:%.asm=$(OBJDIR)/%)
|
BINS := $(SRC:%.asm=$(OBJDIR)/%)
|
||||||
|
@@ -1,3 +1,3 @@
|
|||||||
# asm
|
# asm
|
||||||
|
|
||||||
Build x86_64 assembly examples from [asmtutor.com](https://asmtutor.com)
|
x86 assembly exercises using [asmtutor.com](https://asmtutor.com)
|
||||||
|
39
functions.asm
Normal file
39
functions.asm
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
SYS_EXIT equ 1
|
||||||
|
SYS_WRITE equ 4
|
||||||
|
STDOUT equ 1
|
||||||
|
|
||||||
|
strlen:
|
||||||
|
push ebx
|
||||||
|
mov ebx, eax
|
||||||
|
nextchar:
|
||||||
|
cmp byte[eax], 0
|
||||||
|
jz finished
|
||||||
|
inc eax
|
||||||
|
jmp nextchar
|
||||||
|
finished:
|
||||||
|
sub eax, ebx
|
||||||
|
pop ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
print:
|
||||||
|
push ebx
|
||||||
|
push ecx
|
||||||
|
push edx
|
||||||
|
|
||||||
|
mov ebx, eax
|
||||||
|
call strlen
|
||||||
|
mov edx, eax
|
||||||
|
mov ecx, ebx
|
||||||
|
mov ebx, STDOUT
|
||||||
|
mov eax, SYS_WRITE
|
||||||
|
int 0x80
|
||||||
|
|
||||||
|
pop edx
|
||||||
|
pop ecx
|
||||||
|
pop ebx
|
||||||
|
ret
|
||||||
|
|
||||||
|
quit:
|
||||||
|
mov ebx, 0
|
||||||
|
mov eax, SYS_EXIT
|
||||||
|
int 0x80
|
@@ -1,39 +1,15 @@
|
|||||||
; Hello World Program - asmtutor.com
|
%include 'functions.asm'
|
||||||
; Compile with: nasm -f elf helloworld.asm
|
|
||||||
; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld.o -o helloworld
|
|
||||||
; Run with: ./helloworld
|
|
||||||
|
|
||||||
SECTION .data
|
section .data
|
||||||
msg db 'Hello, brave new world!', 0Ah ; assign msg variable with your message string
|
msg1 db "Hello, world!", 0Ah
|
||||||
|
msg2 db "Display a line of text", 0Ah
|
||||||
|
|
||||||
SECTION .text
|
section .text
|
||||||
global _start
|
global _start
|
||||||
|
|
||||||
_start:
|
_start:
|
||||||
mov eax, msg
|
mov eax, msg1
|
||||||
call strlen
|
call print
|
||||||
|
mov eax, msg2
|
||||||
mov edx, eax ; our function leaves the result in EAX
|
call print
|
||||||
mov ecx, msg
|
call quit
|
||||||
mov ebx, 1 ; STDOUT
|
|
||||||
mov eax, 4 ; SYS_WRITE
|
|
||||||
int 80h
|
|
||||||
|
|
||||||
mov ebx, 0 ; return 0
|
|
||||||
mov eax, 1 ; SYS_EXIT
|
|
||||||
int 80h
|
|
||||||
|
|
||||||
strlen:
|
|
||||||
push ebx ; preserve EBX while we use in this function
|
|
||||||
mov ebx, eax ; move the address in EAX into EBX
|
|
||||||
|
|
||||||
nextchar:
|
|
||||||
cmp byte [eax], 0 ; compare the byte pointed to by EAX at this address against zero (Zero is an end of string delimiter)
|
|
||||||
jz finished ; jump (if the zero flagged has been set) to the point in the code labeled 'finished'
|
|
||||||
inc eax ; increment the address in EAX by one byte (if the zero flagged has NOT been set)
|
|
||||||
jmp nextchar ; jump to the point in the code labeled 'nextchar'
|
|
||||||
|
|
||||||
finished:
|
|
||||||
sub eax, ebx
|
|
||||||
pop ebx
|
|
||||||
ret
|
|
||||||
|
Reference in New Issue
Block a user