编写一个程序,完成从键盘输入一个17位的身份证号,(即身份证的前17位),计算补充最后一位数字校验码并将完整的18位身份证号显示出来

匿名 (未验证) 提交于 2019-12-03 00:26:01
;根据《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定
;公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
;排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
;顺序码的奇数分给男性,偶数分给女性。
;校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
;关于计算方法自行百度
;编写一个程序,完成从键盘输入一个17位的身份证号,(即身份证的前17位),计算补充最后一位数字校验码
;并将完整的18位身份证号显示出来
DATA SEGMENT
BUFFER DB 18,?,18 DUP(0)
Wi     DB 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
CHECKC DB 1,0,'X',9,8,7,6,5,4,3,2
C      DB ?
S      DW ?
CRLF   DB 0AH,0DH,'$'
DATA ENDS

STACK SEGMENT PARA STACK
      DW 128 DUP(?)
TOP   LABEL WORD
STACK ENDS

CODE SEGMENT
     ASSUME CS:CODE,SS:STACK,DS:DATA
MAIN PROC FAR
START:
         MOV AX,DATA
MOV DS,AX
 
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
 
LEA DX,BUFFER       ;接收键盘输入并存入BUFFER中,以回车键结束输入
MOV AH,10
INT 21H
 
MOV AH,9
LEA DX,CRLF
INT 21H
 
LEA SI,BUFFER
ADD SI,2
LEA DI,Wi
XOR AX,AX
XOR BX,BX
MOV CX,17
 
L0: MOV AL,[SI]             ;Ai*Wi并累加,自行百度累加过程
SUB AL,30H              ;键盘输入后存放在BUFFER中的是ASCII码,要减去30H才会得到实际数
MOV DL,[DI]
MUL DL
ADD BX,AX
INC SI
INC DI
LOOP L0
 
LEA SI,S
MOV [SI],BX
 
MOV AX,BX
XOR DX,DX
MOV BX,11
DIV BX
 
LEA SI,CHECKC
ADD SI,DX
MOV BL,[SI]
LEA DI,C
         MOV [DI],BL


MOV CX,17            ;输出18位身份证号
LEA SI,BUFFER
 
        ADD SI,2
L1:    MOV DL,[SI]
MOV AH,2
INT 21H
INC SI
LOOP L1
       
CMP BL,'X'
JE  L2
ADD BL,30H
L2: MOV DL,BL
MOV AH,2
INT 21H
 
MOV AH,9
LEA DX,CRLF
INT 21H
 
LEA SI,S           ;输出S
MOV AX,[SI]
XOR CX,CX
MOV BX,10
 
L3:    XOR DX,DX
         DIV BX
PUSH DX
INC CX
CMP AX,0
JNE L3
 
L4: POP DX
ADD DL,30H
MOV AH,2
INT 21H
LOOP L4
 
MOV AH,4CH           ;结束程序
INT 21H
CODE ENDS
MAIN ENDP
     END START


 
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!