spartserv

Simple client and server for the spartan protocol
git clone https://noulin.net/git/spartserv.git
Log | Files | Refs | README

string.asm (3789B)


      1 get_string_length: ; rdi = pointer, ret rax
      2     stackpush
      3     cld
      4     mov r10, -1
      5     mov rsi, rdi
      6 get_string_length_start:
      7     inc r10
      8     lodsb
      9     cmp al, 0x00
     10     jne get_string_length_start
     11     mov rax, r10
     12     stackpop
     13     ret
     14 
     15 string_copy: ; rdi = dest, rsi = source, rdx = bytes to copy
     16     stackpush
     17     mov rcx, rdx
     18     inc rcx ; to get null
     19     cld
     20     rep movsb
     21     stackpop
     22     ret
     23 
     24 string_atoi: ; rdi = string, rax = int
     25     stackpush
     26 
     27     mov r8, 0 ; ;return
     28 
     29     call get_string_length
     30     mov r10, rax ; length
     31     cmp rax, 0
     32     je string_atoi_ret_empty
     33 
     34     mov r9, 1 ; multiplier
     35 
     36     dec r10
     37     string_atoi_loop:
     38     xor rbx, rbx
     39     mov bl, BYTE [rdi+r10]
     40     sub bl, 0x30   ;get byte, subtract to get real from ascii value
     41     mov rax, r9
     42     mul rbx         ; multiply value by multiplier
     43     add r8, rax    ; add result to running total
     44     dec r10        ; next digit
     45     mov rax, 10 ; multiply r9 ( multiplier ) by 10
     46     mul r9
     47     mov r9, rax
     48     cmp r10, -1
     49     jne string_atoi_loop
     50     jmp string_atoi_ret
     51 
     52     string_atoi_ret_empty:
     53     mov rax, -1
     54     stackpop
     55     ret
     56 
     57     string_atoi_ret:
     58     mov rax, r8
     59     stackpop
     60     ret
     61 
     62 string_contains: ;rdi = haystack, rsi = needle, ret = rax: location of string, else -1
     63     stackpush
     64 
     65     xor r10, r10 ; total length from beginning
     66     xor r8, r8 ; count from offset
     67 
     68     string_contains_start:
     69     mov dl, BYTE [rdi]
     70     cmp dl, 0x00
     71     je string_contains_ret_no
     72     cmp dl, BYTE [rsi]
     73     je string_contains_check
     74     inc rdi
     75     inc r10 ; count from base ( total will be r10 + r8 )
     76     jmp string_contains_start
     77 
     78     string_contains_check:
     79     inc r8 ; already checked at pos 0
     80     cmp BYTE [rsi+r8], 0x00
     81     je string_contains_ret_ok
     82     mov dl, [rdi+r8]
     83     cmp dl ,0x00
     84     je string_contains_ret_no
     85     cmp dl, [rsi+r8]
     86     je string_contains_check
     87 
     88     inc rdi
     89     inc r10
     90     xor r8, r8
     91     jmp string_contains_start
     92 
     93     string_contains_ret_ok:
     94     mov rax, r10
     95     jmp string_contains_ret
     96 
     97     string_contains_ret_no:
     98     mov rax, -1
     99 
    100     string_contains_ret:
    101     stackpop
    102     ret
    103 
    104 ;Removes first instance of string
    105 string_remove: ;rdi = source, rsi = string to remove, ret = 1 for removed, 0 for not found
    106     stackpush
    107 
    108     mov r9, 0 ; return flag
    109 
    110     call get_string_length
    111     mov r8, rax ;  r8: source length
    112     cmp r8, 0
    113     mov rax, 0
    114     jle string_remove_ret ; source string empty?
    115 
    116     push rdi
    117     mov rdi, rsi
    118     call get_string_length
    119     mov r10, rax ; r10: string to remove length
    120     pop rdi
    121     cmp r10, 0
    122     mov rax, 0
    123     jle string_remove_ret ; string to remove is blank?
    124 
    125     string_remove_start:
    126 
    127     call string_contains
    128 
    129     cmp rax,-1
    130     je string_remove_ret
    131 
    132     ;Shift source string over
    133     add rdi, rax
    134     mov rsi, rdi
    135     add rsi, r10 ; copying to itself sans found string
    136 
    137     cld
    138     string_remove_do_copy:
    139     lodsb
    140     stosb
    141     cmp al, 0x00
    142     jne string_remove_do_copy
    143 
    144     mov r9, 1
    145 
    146     string_remove_ret:
    147     mov rax, r9
    148     stackpop
    149     ret
    150 
    151 string_ends_with:;rdi = haystack, rsi = needle, ret = rax: 0 false, 1 true
    152     stackpush
    153 
    154     ;Get length of haystack, store in r8
    155     call get_string_length
    156     mov r8, rax
    157 
    158     ;Get length of needle, store in r10
    159     push rdi
    160     mov rdi, rsi
    161     call get_string_length
    162     mov r10, rax
    163     pop rdi
    164 
    165     add rdi, r8
    166     add rsi, r10
    167 
    168     xor rax, rax
    169     xor rdx, rdx
    170 
    171     string_ends_with_loop:
    172     ;Start from end, dec r10 till 0
    173     mov dl, BYTE [rdi]
    174     cmp dl, BYTE [rsi]
    175     jne string_ends_with_ret
    176     dec rdi
    177     dec rsi
    178     dec r10
    179     cmp r10, 0
    180     jne string_ends_with_loop
    181     mov rax, 1
    182 
    183     string_ends_with_ret:
    184     stackpop
    185     ret
    186 
    187 print_line: ; rdi = pointer, rsi = length
    188     stackpush
    189     call sys_write
    190     mov rdi, new_line
    191     mov rsi, 1
    192     call sys_write
    193     stackpop
    194     ret
    195