initial commit
This commit is contained in:
commit
1bff04e860
|
@ -0,0 +1,10 @@
|
|||
ASMFLAGS =
|
||||
CFLAGS = -I lib -O3
|
||||
|
||||
build: src/strutils.asm src/main.c
|
||||
nasm $(ASMFLAGS) -f elf64 -o out/strutils.o src/strutils.asm
|
||||
#gcc $(CFLAGS) -o out/main.o -c src/main.c
|
||||
#ld -o bin/main out/main.o out/strutils.o
|
||||
gcc $(CFLAGS) -o bin/main \
|
||||
src/main.c \
|
||||
out/strutils.o
|
|
@ -0,0 +1 @@
|
|||
void count_vowels(char *str, int *result);
|
|
@ -0,0 +1,16 @@
|
|||
#include <stdio.h>
|
||||
#include "strutils.h"
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char source_string[1024];
|
||||
int amount_of_vowels;
|
||||
|
||||
fgets(source_string, 1023, stdin);
|
||||
|
||||
count_vowels(source_string, &amount_of_vowels);
|
||||
|
||||
printf("%d\n", amount_of_vowels);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
global count_vowels
|
||||
|
||||
section .note.GNU-stack
|
||||
|
||||
section .text
|
||||
|
||||
vowel_found:
|
||||
inc r12
|
||||
jmp next_char
|
||||
|
||||
; void count_vowels(char *str, int *result);
|
||||
; | |
|
||||
; v v
|
||||
; %rdi %rsi
|
||||
count_vowels:
|
||||
; back up the pointers
|
||||
push rsi
|
||||
push rdi
|
||||
|
||||
; find string length
|
||||
mov rcx, 1024
|
||||
mov al, 0
|
||||
; rdi is set by caller
|
||||
|
||||
repne scasb
|
||||
|
||||
; not wasting time on JNE
|
||||
; as ZF should always equal to 1
|
||||
|
||||
mov rdi, rcx
|
||||
mov rcx, 1024
|
||||
sub rcx, rdi ; strlen -> rcx
|
||||
|
||||
; recover *str
|
||||
pop rdi
|
||||
|
||||
; loop through the letters
|
||||
xor r12, r12 ; reset counter
|
||||
|
||||
loop1:
|
||||
mov bl, [rdi+rcx-1]
|
||||
cmp bl, 0x3F
|
||||
jle next_char ; if the symbol code <= 0x3F,
|
||||
; it can never be a letter
|
||||
|
||||
and bl, 0x5F ; 0x5F -> 01011111
|
||||
; ^ ^
|
||||
; | cut off 6th bit to cast
|
||||
; | all letters to uppercase
|
||||
; |
|
||||
; cut off any signed nonsense
|
||||
|
||||
cmp bl, 'A'
|
||||
je vowel_found
|
||||
|
||||
cmp bl, 'Y'
|
||||
jg next_char
|
||||
je vowel_found
|
||||
|
||||
cmp bl, 'E'
|
||||
je vowel_found
|
||||
|
||||
cmp bl, 'I'
|
||||
je vowel_found
|
||||
|
||||
cmp bl, 'O'
|
||||
je vowel_found
|
||||
|
||||
cmp bl, 'U'
|
||||
je vowel_found
|
||||
|
||||
next_char:
|
||||
dec rcx
|
||||
jnz loop1
|
||||
|
||||
pop rsi
|
||||
|
||||
; copy result to target memory location
|
||||
mov [rsi], r12d
|
||||
|
||||
ret
|
Loading…
Reference in New Issue