汇编语言(二十七)之身份证最后一位求和校验

汇编语言(二十七)之身份证最后一位求和校验

输入身份证前十七位数字,输入18位身份证

程序运行:

www.zeeklog.com  - 汇编语言(二十七)之身份证最后一位求和校验

代码:


datas segment

      w      db  7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
	  
	  y      db  '1','0','X','9','8','7','6','5','4','3','2'

	  ID_max_length      db  18
	  ID                 db  0, 19 dup(?)
	  input              db 'input 17-bit digital code=$'
	  output             db 0dh,0ah,'output ID=$'
	  output_error       db 0dh,0ah,'input error$'
	  
datas ends

stacks segment stack

    db  100h dup(?)

stacks ends

codes segment

assume cs:codes,ds:datas,ss:stacks
main   proc  far
start:
       push ds
	   mov ax,0h
	   push ax
       mov ax,datas          ;初始化ds
	   mov ds,ax
       
	    ;输入提示
	   lea dx,input
	   mov ah,9
	   int 21h
	   ;输入N
	   lea dx,ID_max_length
	   mov ah,10 
	   int 21h
	   
	   lea si,ID
	   mov cl,[si]                 ;设置循环次数
	   cmp cl,17                   ;判断长度是否合法
	   jnz err
	   
       xor ch,ch 
	   inc si 
	   mov dx,0 
	   s:
	    mov al,17
	    sub al,cl  
		lea bx,w
		xlat                       ;获取Wi
		
	    mov bl,[si]
		cmp bl,'0'                 ;判断字符是否合法
		jb err
		cmp bl,'9'
		ja err
		sub bl,30h                ;获取Ai
		
		mul bl                    ;乘积
	    add dx,ax                 ;累加求和
		inc si
		loop s 
		
		mov ax,dx
        mov	bl,11	              ;和对11求余数
		div bl
		mov al,ah 
		lea bx,y
		xlat                     ;获得第一位字符
		mov ID+1+17,al           ;设置输出字符串
		mov ID+1+18,'$'
		
		lea dx,output           ;输出提示
		mov ah,9
		int 21h
		
		lea dx,ID+1             ;输出身份证号码
		mov ah,9
		int 21h
		
		jmp exit
		
	   err:
		lea dx,output_error         ;若错误,输出错误提示
		mov ah,9
		int 21h  
       
       exit:
       ret
	   
main endp
codes ends

end main