95 lines
1013 B
NASM
95 lines
1013 B
NASM
|
; LuhnA - Luhn algorithm
|
|||
|
; by Albom
|
|||
|
|
|||
|
use32
|
|||
|
org 0
|
|||
|
db 'MENUET01'
|
|||
|
dd 1
|
|||
|
dd _start
|
|||
|
dd _end
|
|||
|
dd _memory
|
|||
|
dd _stack
|
|||
|
dd _param
|
|||
|
dd 0
|
|||
|
|
|||
|
include '../../macros.inc'
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
_start:
|
|||
|
|
|||
|
mov al, [_param]
|
|||
|
test al, al
|
|||
|
jz exit
|
|||
|
|
|||
|
call luhna
|
|||
|
xor edx, edx
|
|||
|
mov ecx, 10
|
|||
|
div ecx
|
|||
|
|
|||
|
test edx, edx
|
|||
|
jz valid
|
|||
|
mov ebx, msg_not
|
|||
|
jmp print
|
|||
|
valid:
|
|||
|
mov ebx, msg_valid
|
|||
|
|
|||
|
print:
|
|||
|
mov [notifyapp+2*4], ebx
|
|||
|
mcall 70, notifyapp
|
|||
|
|
|||
|
|
|||
|
exit:
|
|||
|
mcall -1
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
align 4
|
|||
|
luhna:
|
|||
|
xor edx, edx
|
|||
|
xor ecx, ecx
|
|||
|
xor eax, eax
|
|||
|
mov esi, _param
|
|||
|
@@:
|
|||
|
lodsb
|
|||
|
test al, al
|
|||
|
jz .exit
|
|||
|
sub al, '0'
|
|||
|
mov dl, [odd+eax]
|
|||
|
add ecx, edx
|
|||
|
lodsb
|
|||
|
test al, al
|
|||
|
jz .exit
|
|||
|
sub al, '0'
|
|||
|
add ecx, eax
|
|||
|
jmp @b
|
|||
|
.exit:
|
|||
|
mov eax, ecx
|
|||
|
ret
|
|||
|
|
|||
|
align 4
|
|||
|
msg_not db 'NOT '
|
|||
|
msg_valid db 'VALID', 0
|
|||
|
|
|||
|
align 4
|
|||
|
odd: db 0, 2, 4, 6, 8, 1, 3, 5, 7, 9
|
|||
|
|
|||
|
align 4
|
|||
|
notifyapp:
|
|||
|
dd 7
|
|||
|
dd 0
|
|||
|
dd 0 ; <20><><EFBFBD><EFBFBD><EFBFBD> ᮮ<>饭<EFBFBD><E9A5AD>
|
|||
|
dd 0
|
|||
|
dd 0
|
|||
|
db '@notify', 0
|
|||
|
|
|||
|
|
|||
|
_end:
|
|||
|
align 4
|
|||
|
rb 256
|
|||
|
_stack:
|
|||
|
align 4
|
|||
|
_param rb 256
|
|||
|
_memory:
|