;根据《中华人民共和国国家标准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
;公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
;排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
;顺序码的奇数分给男性,偶数分给女性。
;校验码是根据前面十七位数字码,按照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