汇编语言(二十七)之身份证最后一位求和校验
输入身份证前十七位数字,输入18位身份证
程序运行:
代码:
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