; 修正后的完整程序
.MODEL SMALL
.STACK 100H
.DATA
PROMPT DB '请输入身份证号(18位): $'
ERROR_MSG DB 0DH,0AH,'身份证号错误!$'
VALID_MSG DB 0DH,0AH,'身份证号有效!$'
BIRTH_MSG DB 0DH,0AH,'出生日期: $'
GENDER_MSG DB 0DH,0AH,'性别: $'
PROVINCE_MSG DB 0DH,0AH,'省份: $'
ID_BUFFER DB 19 ; 最大长度
DB ? ; 实际长度
DB 19 DUP('$') ; 初始化缓冲区
WEIGHTS DB 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2
CHECK_CODES DB '10X98765432'
PROVINCES DB '11','北京市$'
DB '44','广东省$'
DB '31','上海市$'
DB 00H ; 结束标记
BIRTH_DATE DB 'YYYYMMDD$'
GENDER DB '男$','女$'
UNKNOWN_PROV DB '未知地区$'
.CODE
START:
MOV AX, @DATA
MOV DS, AX
; 显示输入提示
MOV AH, 09H
LEA DX, PROMPT
INT 21H
; 读取身份证号
MOV AH, 0AH
LEA DX, ID_BUFFER
INT 21H
; 验证长度
CMP [ID_BUFFER+1], 18
JNE INVALID
; 验证前17位为数字
MOV CX, 17
LEA SI, ID_BUFFER+2
CHECK_DIGITS:
MOV AL, [SI]
CMP AL, '0'
JB INVALID
CMP AL, '9'
JA INVALID
INC SI
LOOP CHECK_DIGITS
; 验证校验位(增加大小写转换)
CALL CALC_CHECK_DIGIT
LEA SI, ID_BUFFER+2+17
MOV AH, [SI]
; 转换小写x为大写X
CMP AH, 'x'
JNE COMPARE_CHECK
MOV AH, 'X'
COMPARE_CHECK:
CMP AL, AH
JNE INVALID
; 显示有效信息
MOV AH, 09H
LEA DX, VALID_MSG
INT 21H
; 提取出生日期
LEA SI, ID_BUFFER+2+6
LEA DI, BIRTH_DATE
MOV CX, 8
COPY_BIRTH:
MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
LOOP COPY_BIRTH
; 显示出生日期
MOV AH, 09H
LEA DX, BIRTH_MSG
INT 21H
LEA DX, BIRTH_DATE
INT 21H
; 查找省份
CALL FIND_PROVINCE
; 判断性别
LEA SI, ID_BUFFER+2+16
MOV AL, [SI]
SUB AL, '0'
TEST AL, 1
JZ FEMALE
; 显示男性
MOV AH, 09H
LEA DX, GENDER_MSG
INT 21H
LEA DX, GENDER
INT 21H
JMP EXIT
FEMALE:
; 显示女性
MOV AH, 09H
LEA DX, GENDER_MSG
INT 21H
LEA DX, GENDER+3 ; 修正偏移量
INT 21H
EXIT:
MOV AH, 4CH
INT 21H
INVALID:
MOV AH, 09H
LEA DX, ERROR_MSG
INT 21H
JMP EXIT
; 计算校验位子程序(优化寄存器使用)
CALC_CHECK_DIGIT PROC NEAR
PUSH BX
PUSH CX
MOV CX, 17
LEA SI, ID_BUFFER+2
LEA DI, WEIGHTS
XOR BX, BX
CALC_LOOP:
MOV AL, [SI]
SUB AL, '0'
MUL BYTE PTR [DI]
ADD BX, AX
INC SI
INC DI
LOOP CALC_LOOP
MOV AX, BX
MOV CL, 11
DIV CL
LEA SI, CHECK_CODES
XOR BH, BH
MOV BL, AH
MOV AL, [SI+BX]
POP CX
POP BX
RET
CALC_CHECK_DIGIT ENDP
; 查找省份子程序(优化搜索逻辑)
FIND_PROVINCE PROC NEAR
PUSH SI
LEA SI, ID_BUFFER+2
MOV AX, [SI]
LEA DI, PROVINCES
SEARCH_LOOP:
CMP BYTE PTR [DI], 0
JE NOT_FOUND
CMP AX, [DI]
JE FOUND_PROV
ADD DI, 2
SKIP_PROV:
CMP BYTE PTR [DI], '$'
JE NEXT_PROV
INC DI
JMP SKIP_PROV
NEXT_PROV:
INC DI
JMP SEARCH_LOOP
FOUND_PROV:
ADD DI, 2
MOV AH, 09H
LEA DX, PROVINCE_MSG
INT 21H
MOV DX, DI
INT 21H
POP SI
RET
NOT_FOUND:
MOV AH, 09H
LEA DX, PROVINCE_MSG
INT 21H
LEA DX, UNKNOWN_PROV
INT 21H
POP SI
RET
FIND_PROVINCE ENDP
END START这里出错(13) unterminated string: "
(13) mismatched or misplaced quotes