Calc+ v0.2β: add "^" operator, bugfixes, optimization.
git-svn-id: svn://kolibrios.org@4875 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -12,48 +12,25 @@
|
||||
ret
|
||||
}
|
||||
|
||||
proc convert_to_str uses ebx ecx edx esi edi, _num, _str
|
||||
mov eax, [_num]
|
||||
mov esi, [_str]
|
||||
mov edi, 0
|
||||
mov ecx, eax
|
||||
and ecx, 1 shl 31
|
||||
cmp ecx, 0
|
||||
je @f
|
||||
mov [esi], byte "-"
|
||||
inc esi
|
||||
inc edi
|
||||
not eax
|
||||
inc eax
|
||||
@@:
|
||||
mov ebx, 10
|
||||
xor ecx, ecx
|
||||
@@:
|
||||
xor edx, edx
|
||||
div ebx
|
||||
push edx
|
||||
inc ecx
|
||||
inc edi
|
||||
cmp eax, 0
|
||||
jne @b
|
||||
@@:
|
||||
pop eax
|
||||
add al, "0"
|
||||
mov [esi], al
|
||||
inc esi
|
||||
loop @b
|
||||
mov [esi], byte 0
|
||||
mov eax, edi
|
||||
ret
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
|
||||
proc parse
|
||||
mov [exp_pos], 0
|
||||
stdcall skip_spaces
|
||||
|
||||
mov ebx, exp
|
||||
add ebx, [exp_pos]
|
||||
cmp [ebx], byte 0
|
||||
je .null_exp
|
||||
|
||||
mov [exp_lvl], 0
|
||||
mov [error_n], 0
|
||||
stdcall parse_lvl0
|
||||
ret
|
||||
|
||||
.null_exp:
|
||||
mov eax, 0
|
||||
ret
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
@@ -68,7 +45,7 @@
|
||||
cmp [ebx], byte 0
|
||||
je .end
|
||||
cmp [ebx], byte ")"
|
||||
je .end
|
||||
je .brk_end
|
||||
inc [exp_pos]
|
||||
cmp [ebx], byte "+"
|
||||
jne .not_add
|
||||
@@ -79,15 +56,23 @@
|
||||
jmp @b
|
||||
.not_add:
|
||||
cmp [ebx], byte "-"
|
||||
jne @b
|
||||
jne .unexp_char
|
||||
mov ecx, eax
|
||||
stdcall parse_lvl1
|
||||
test_err
|
||||
sub ecx, eax
|
||||
mov eax, ecx
|
||||
jmp @b
|
||||
.brk_end:
|
||||
cmp [exp_lvl], 0
|
||||
jne @f
|
||||
set_err 3
|
||||
@@:
|
||||
dec [exp_lvl]
|
||||
.end:
|
||||
ret
|
||||
.unexp_char:
|
||||
set_err 4
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
@@ -101,9 +86,9 @@
|
||||
add ebx, [exp_pos]
|
||||
cmp [ebx], byte 0
|
||||
je .end
|
||||
inc [exp_pos]
|
||||
cmp [ebx], byte "*"
|
||||
jne .not_mul
|
||||
inc [exp_pos]
|
||||
mov ecx, eax
|
||||
stdcall parse_lvl2
|
||||
test_err
|
||||
@@ -117,6 +102,7 @@
|
||||
je .div_or_mod
|
||||
jmp .end
|
||||
.div_or_mod:
|
||||
inc [exp_pos]
|
||||
mov ecx, eax
|
||||
stdcall parse_lvl2
|
||||
test_err
|
||||
@@ -134,13 +120,35 @@
|
||||
mov eax, edx
|
||||
jmp @b
|
||||
.end:
|
||||
dec [exp_pos]
|
||||
ret
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
|
||||
proc parse_lvl2 uses ebx
|
||||
proc parse_lvl2 uses ebx ecx edx
|
||||
test_err
|
||||
stdcall parse_lvl3
|
||||
test_err
|
||||
@@:
|
||||
mov ebx, exp
|
||||
add ebx, [exp_pos]
|
||||
cmp [ebx], byte 0
|
||||
je .end
|
||||
cmp [ebx], byte "^"
|
||||
jne .end
|
||||
inc [exp_pos]
|
||||
mov ecx, eax
|
||||
stdcall parse_lvl2
|
||||
test_err
|
||||
stdcall c_power
|
||||
jmp @b
|
||||
.end:
|
||||
ret
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
|
||||
proc parse_lvl3 uses ebx
|
||||
test_err
|
||||
stdcall skip_spaces
|
||||
mov ebx, exp
|
||||
@@ -149,36 +157,73 @@
|
||||
jl @f
|
||||
cmp [ebx], byte 57
|
||||
jg @f
|
||||
stdcall parse_lvl3
|
||||
stdcall parse_lvl4
|
||||
jmp .end
|
||||
@@:
|
||||
inc [exp_pos]
|
||||
cmp [ebx], byte "("
|
||||
jne @f
|
||||
inc [exp_lvl]
|
||||
stdcall parse_lvl0
|
||||
test_err
|
||||
mov ebx, exp
|
||||
add ebx, [exp_pos]
|
||||
cmp [ebx], byte ")"
|
||||
je .brk_ok
|
||||
set_err 2
|
||||
.brk_ok:
|
||||
inc [exp_pos]
|
||||
jmp .end
|
||||
@@:
|
||||
cmp [ebx], byte "+"
|
||||
jne @f
|
||||
stdcall parse_lvl2
|
||||
stdcall parse_lvl3
|
||||
test_err
|
||||
jmp .end
|
||||
@@:
|
||||
cmp [ebx], byte "-"
|
||||
jne .end
|
||||
stdcall parse_lvl2
|
||||
jne .unexp_char
|
||||
stdcall parse_lvl3
|
||||
test_err
|
||||
neg eax
|
||||
.end:
|
||||
stdcall skip_spaces
|
||||
ret
|
||||
.unexp_char:
|
||||
set_err 4
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
|
||||
proc parse_lvl3 uses ebx ecx
|
||||
proc parse_lvl4 uses ebx ecx
|
||||
stdcall parse_lvl5
|
||||
@@:
|
||||
mov ebx, exp
|
||||
add ebx, [exp_pos]
|
||||
cmp [ebx], byte 0
|
||||
je .end
|
||||
cmp [ebx], byte "^"
|
||||
jne .end
|
||||
inc [exp_pos]
|
||||
mov ecx, eax
|
||||
mov ebx, exp
|
||||
add ebx, [exp_pos]
|
||||
cmp [ebx], byte 48
|
||||
jl .unexp_char
|
||||
cmp [ebx], byte 57
|
||||
jg .unexp_char
|
||||
stdcall parse_lvl4
|
||||
stdcall c_power
|
||||
jmp @b
|
||||
.end:
|
||||
ret
|
||||
.unexp_char:
|
||||
set_err 4
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
|
||||
proc parse_lvl5 uses ebx ecx
|
||||
sub eax, eax
|
||||
sub ecx, ecx
|
||||
mov ebx, exp
|
||||
@@ -214,4 +259,56 @@
|
||||
jmp @b
|
||||
@@:
|
||||
ret
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
|
||||
proc c_power uses ebx
|
||||
mov ebx, eax
|
||||
mov eax, 1
|
||||
@@:
|
||||
cmp ebx, 0
|
||||
je @f
|
||||
imul eax, ecx
|
||||
dec ebx
|
||||
jmp @b
|
||||
@@:
|
||||
ret
|
||||
endp
|
||||
|
||||
; ---------------------------
|
||||
|
||||
proc convert_to_str uses ebx ecx edx esi edi, _num, _str
|
||||
mov eax, [_num]
|
||||
mov esi, [_str]
|
||||
mov edi, 0
|
||||
mov ecx, eax
|
||||
and ecx, 1 shl 31
|
||||
cmp ecx, 0
|
||||
je @f
|
||||
mov [esi], byte "-"
|
||||
inc esi
|
||||
inc edi
|
||||
not eax
|
||||
inc eax
|
||||
@@:
|
||||
mov ebx, 10
|
||||
xor ecx, ecx
|
||||
@@:
|
||||
xor edx, edx
|
||||
div ebx
|
||||
push edx
|
||||
inc ecx
|
||||
inc edi
|
||||
cmp eax, 0
|
||||
jne @b
|
||||
@@:
|
||||
pop eax
|
||||
add al, "0"
|
||||
mov [esi], al
|
||||
inc esi
|
||||
loop @b
|
||||
mov [esi], byte 0
|
||||
mov eax, edi
|
||||
ret
|
||||
endp
|
Reference in New Issue
Block a user