Compare commits
2 Commits
ce76ecc2b4
...
09649f52d5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
09649f52d5 | ||
|
|
0d80bed612 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,2 +1,6 @@
|
||||
.direnv/
|
||||
*/**/a.out
|
||||
*/**/*.o
|
||||
libasm.a
|
||||
out
|
||||
tester
|
||||
|
||||
44
Makefile
Normal file
44
Makefile
Normal file
@@ -0,0 +1,44 @@
|
||||
SHELL = bash
|
||||
|
||||
# --- lib ---
|
||||
|
||||
NAME = libasm.a
|
||||
|
||||
OBJ_DIR = obj/
|
||||
SRC_DIR = src/
|
||||
SRC = $(shell find $(SRC_DIR) -name '*.s')
|
||||
OBJ = $(addprefix $(OBJ_DIR), $(SRC:.s=.o))
|
||||
|
||||
AS = nasm
|
||||
ASFLAGS = -f elf64
|
||||
|
||||
# --- tester ---
|
||||
|
||||
t_CC = gcc
|
||||
t_CFLAGS = -z noexecstack
|
||||
t_SRC = src/tests/main.c
|
||||
t_NAME = tester
|
||||
|
||||
all: $(NAME)
|
||||
|
||||
$(NAME): $(OBJ)
|
||||
ar rcs -o $@ $(OBJ)
|
||||
|
||||
$(OBJ_DIR)%.o: %.s
|
||||
@mkdir -p $(@D)
|
||||
$(AS) $(ASFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
rm -rf $(OBJ_DIR)
|
||||
|
||||
|
||||
fclean: clean
|
||||
rm $(NAME)
|
||||
|
||||
re: fclean
|
||||
$(MAKE) -s all
|
||||
|
||||
test: $(OBJ)
|
||||
$(t_CC) $(OBJ) $(t_SRC) $(t_CFLAGS) -o $(t_NAME)
|
||||
|
||||
.PHONY: clean fclean all re
|
||||
27
flake.lock
generated
Normal file
27
flake.lock
generated
Normal file
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1751274312,
|
||||
"narHash": "sha256-/bVBlRpECLVzjV19t5KMdMFWSwKLtb5RyXdjz3LJT+g=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "50ab793786d9de88ee30ec4e4c24fb4236fc2674",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"id": "nixpkgs",
|
||||
"ref": "nixos-24.11",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
28
flake.nix
Normal file
28
flake.nix
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
description = "a test development environment for python";
|
||||
|
||||
inputs = {
|
||||
|
||||
nixpkgs = {
|
||||
url = "nixpkgs/nixos-24.11";
|
||||
flake = false;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
outputs = inputs@{ nixpkgs, ... }:
|
||||
{
|
||||
devShell = {
|
||||
x86_64-linux = let
|
||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||
in pkgs.mkShell {
|
||||
packages = with pkgs; [
|
||||
gcc nasm gnumake
|
||||
];
|
||||
shellHook = ''
|
||||
echo -e "\x1B[0;33mentering libasm environment...\x1B[0m"
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -9,11 +9,13 @@ ft_strcmp:
|
||||
cmp rsi, 0
|
||||
je .ret
|
||||
|
||||
mov rax, rdi
|
||||
|
||||
.loop:
|
||||
|
||||
mov r10b, BYTE [rdi]
|
||||
cmp r10b, BYTE [rsi]
|
||||
je .end
|
||||
jne .end
|
||||
|
||||
cmp BYTE [rdi], 0
|
||||
je .end
|
||||
@@ -25,8 +27,11 @@ ft_strcmp:
|
||||
jmp .loop
|
||||
|
||||
.end:
|
||||
mov al, BYTE [rsi]
|
||||
mov r10b, BYTE [rdi]
|
||||
movzx rax, BYTE [rdi]
|
||||
movzx r10, BYTE [rsi]
|
||||
sub rax, r10
|
||||
|
||||
;sub rdi, rax
|
||||
;mov rax, rdi
|
||||
.ret:
|
||||
ret
|
||||
|
||||
22
src/sys/ft_write.s
Normal file
22
src/sys/ft_write.s
Normal file
@@ -0,0 +1,22 @@
|
||||
extern __errno_location
|
||||
|
||||
section .text
|
||||
global ft_write
|
||||
|
||||
; ssize_t write(int fd, const void *buf, size_t count);
|
||||
ft_write:
|
||||
mov eax, 1
|
||||
syscall
|
||||
|
||||
cmp rax, 0
|
||||
jle .error
|
||||
|
||||
.ret:
|
||||
ret
|
||||
|
||||
.error:
|
||||
mov r10, rax
|
||||
call __errno_location wrt ..plt
|
||||
mov [rax], r10
|
||||
mov rax, -1
|
||||
jmp .ret
|
||||
@@ -1,8 +1,10 @@
|
||||
int ft_strlen(char *str);
|
||||
char *ft_strcpy(char *dest, const char *src);
|
||||
int ft_strcmp(const char *s1, const char *s2);
|
||||
int ft_write(int fd, const char *buf, unsigned int count);
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
@@ -20,11 +22,20 @@ int main(void)
|
||||
printf("arg : \"abcdefgh\" | result : %s\n", strcpy(a2, "abcdefgh"));
|
||||
printf("arg : \"67\" | result : %s\n", ft_strcpy(a1, "67"));
|
||||
printf("arg : \"67\" | result : %s\n", strcpy(a2, "67"));
|
||||
printf("arg : \"aaa\" (dest = NULL) | result : %s\n", ft_strcpy(NULL, "67"));
|
||||
printf("arg : NULL | result : %s\n", ft_strcpy(a2, NULL));
|
||||
printf("EXCEPTION : dest : NULL | result : %s\n", ft_strcpy(NULL, "67"));
|
||||
printf("EXCEPTION : src : NULL | result : %s\n", ft_strcpy(a2, NULL));
|
||||
|
||||
|
||||
printf("\n--- ft_strcmp ---\n");
|
||||
printf("arg : \"aaaaaa\" \"aaaa\" | result : %d (expected : %d)\n", ft_strcmp("aaaaaa", "aaaa"), strcmp("aaaaaa", "aaaa"));
|
||||
printf("arg : \"aaaa\" \"bb\" | result : %d (expected : %d)\n", ft_strcmp("aaaa", "bb"), strcmp("aaaa", "bb"));
|
||||
printf("arg : \"i love nixos !!\" \"i love nixos !!\" | result : %d (expected : %d)\n", ft_strcmp("i love nixos !!", "i love nixos !!"), strcmp("i love nixos !!", "i love nixos !!"));
|
||||
printf("EXCEPTION : s1 : NULL | result : %d \n", ft_strcmp(NULL, "hiiiii :D"));
|
||||
printf("EXCEPTION : s2 : NULL | result : %d \n", ft_strcmp("hihi :3", NULL));
|
||||
|
||||
printf("\n--- ft_write ---\n");
|
||||
printf("| 1 \"xd\" 2 | %d\n", ft_write(1, "xd", 2));
|
||||
printf("| 200 \"xd\" 2 | %d\n", ft_write(200, "xd", 2));
|
||||
int fd = open("out", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
|
||||
printf("| %d \"[...]\" 42 | %d\n", fd, ft_write(fd, "wizard money gang, we love casting spells\n", 42));
|
||||
}
|
||||
Reference in New Issue
Block a user