mirror of
https://github.com/Noratrieb/asm-coreutils.git
synced 2026-01-16 02:35:02 +01:00
start with wc
This commit is contained in:
parent
19427394db
commit
9cf4469be6
3 changed files with 46 additions and 37 deletions
23
build.sh
23
build.sh
|
|
@ -1,3 +1,11 @@
|
||||||
|
assemble () {
|
||||||
|
FILE="$1"
|
||||||
|
PROGRAM_NAME="$2"
|
||||||
|
|
||||||
|
echo "Assembling $PROGRAM_NAME"
|
||||||
|
nasm -g -F dwarf -f elf64 "$FILE" -o "./target/$PROGRAM_NAME.o" || return
|
||||||
|
}
|
||||||
|
|
||||||
build () {
|
build () {
|
||||||
FILE="$1"
|
FILE="$1"
|
||||||
PROGRAM_NAME=$(basename "$FILE" ".asm")
|
PROGRAM_NAME=$(basename "$FILE" ".asm")
|
||||||
|
|
@ -7,8 +15,16 @@ build () {
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Building $PROGRAM_NAME"
|
|
||||||
nasm -g -F dwarf -f elf64 "$FILE" -o "./target/$PROGRAM_NAME.o" && ld.lld "./target/$PROGRAM_NAME.o" -o "./target/$PROGRAM_NAME"
|
if [ "$PROGRAM_NAME" = "common" ]; then
|
||||||
|
# common does not need to be linked into an executable
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
assemble "$FILE" "$PROGRAM_NAME"
|
||||||
|
|
||||||
|
echo "Linking $PROGRAM_NAME"
|
||||||
|
ld.lld "./target/$PROGRAM_NAME.o" "./target/common.o" -o "./target/$PROGRAM_NAME"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -21,6 +37,9 @@ if [ ! -d ./target ]; then
|
||||||
mkdir ./target
|
mkdir ./target
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
assemble "src/common.asm" "common"
|
||||||
|
|
||||||
if [ "$#" -eq 0 ]; then
|
if [ "$#" -eq 0 ]; then
|
||||||
for FILE in ./src/*.asm ; do
|
for FILE in ./src/*.asm ; do
|
||||||
build "$FILE"
|
build "$FILE"
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1,4 @@
|
||||||
global _start
|
global itoa
|
||||||
|
|
||||||
NUMBER EQU 0
|
|
||||||
|
|
||||||
section .data
|
|
||||||
buffer: times 8 db 0
|
|
||||||
|
|
||||||
|
|
||||||
section .text
|
|
||||||
_start:
|
|
||||||
mov rax, NUMBER
|
|
||||||
mov rbx, buffer
|
|
||||||
call itoa
|
|
||||||
cmp rax, 0
|
|
||||||
jnz error
|
|
||||||
|
|
||||||
write_buffer:
|
|
||||||
mov rax, 1 ; write
|
|
||||||
mov rdi, 1 ; stdout
|
|
||||||
mov rsi, buffer
|
|
||||||
mov rdx, rbx ; the length
|
|
||||||
syscall
|
|
||||||
|
|
||||||
graceful_exit:
|
|
||||||
xor rdi, rdi
|
|
||||||
jmp exit
|
|
||||||
|
|
||||||
error:
|
|
||||||
mov rdi, 1
|
|
||||||
exit:
|
|
||||||
mov rax, 60
|
|
||||||
syscall
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; itoa - converts an unsigned integer into its ascii representation
|
; itoa - converts an unsigned integer into its ascii representation
|
||||||
; inputs:
|
; inputs:
|
||||||
|
|
@ -41,10 +8,12 @@ exit:
|
||||||
; rax - 0: success, 1: error
|
; rax - 0: success, 1: error
|
||||||
; rbx - the length
|
; rbx - the length
|
||||||
|
|
||||||
MAX_SIZE EQU 100000
|
MAX_SIZE EQU 1000000000
|
||||||
START_DIVISOR EQU MAX_SIZE / 10
|
START_DIVISOR EQU MAX_SIZE / 10
|
||||||
ASCII_NUM EQU 48
|
ASCII_NUM EQU 48
|
||||||
|
|
||||||
|
section .text
|
||||||
|
|
||||||
itoa:
|
itoa:
|
||||||
; r12: whether we are in the leading zeroes (bool)
|
; r12: whether we are in the leading zeroes (bool)
|
||||||
; r11: buffer start
|
; r11: buffer start
|
||||||
21
src/wc.asm
Normal file
21
src/wc.asm
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
extern itoa
|
||||||
|
global _start
|
||||||
|
|
||||||
|
section .data
|
||||||
|
itoa_buf: times 100 db 0
|
||||||
|
|
||||||
|
section .text
|
||||||
|
_start:
|
||||||
|
mov rax, 45354
|
||||||
|
mov rbx, itoa_buf
|
||||||
|
call itoa
|
||||||
|
|
||||||
|
mov rdx, rbx
|
||||||
|
mov rax, 1
|
||||||
|
mov rdi, 1
|
||||||
|
mov rsi, itoa_buf
|
||||||
|
syscall
|
||||||
|
|
||||||
|
mov rax, 60
|
||||||
|
xor rdi, rdi
|
||||||
|
syscall
|
||||||
Loading…
Add table
Add a link
Reference in a new issue