nhanh với ạ
Ai xem hộ em nhầm nhọt chỗ nào, chạy thế quái nào cũng ra kết quả như nhau
bài toán : đọc một số nguyên 0<= x <= 255, kiểm tra xem nó có phải là một số hoàn thiện hay không (số hoàn thiện = tổng các ước số của nó, không kể chính nó)
VD: 6 = 3+2+1 => số hoàn thiện
;----------------------------------------------------------------
STACK SEGMENT STACK
DB 100H DUP('STACK')
STACK ENDS
;--------------------------------------------------------------------
DATA_SEG SEGMENT PUBLIC
MSG DB "Enter number (0 =< x <= 255):$"
MSG1 DB "a perfect number$"
MSG2 DB "not a perfect number$"
NUMBER_1 DB 0
SUM DB 0
TEMP_VAR DW 0
DATA_SEG ENDS
;--------------------------------------------------------------------
CODE_SEG SEGMENT PUBLIC
ASSUME CS:CODE_SEG, DSATA_SEG, SS: STACK
START: MOV AX,DATA_SEG
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MSG
INT 21H
CALL CR_LF
CALL GET_AN_INT_NUM
CMP Ax,255
JA EXIT
MOV NUMBER_1,AL
CALL CR_LF
MOV BX,2
DIV BX
MOV CX,AX ;cx = ax div 2
TOP: CALL CHECK
CMP BX,1
JNE NOTSUM
ADD SUM,CL
NOTSUM: ADD SUM,0
LOOP TOP
MOV AL,NUMBER_1
CMP AL,SUM
JE RIGHT
MOV AH,09H
LEA DX,MSG2
INT 21H
JMP EXIT
RIGHT: MOV AH,09H
LEA DX,MSG1
INT 21H
JMP EXIT
EXIT: MOV AH,4CH
INT 21H
CHECK PROC ; ckeck if Ax mod cx = 0 then bx = 1 elseif bx = 0
CMP CX,0
JE WRONG
XOR DX,DX
MOV AL,NUMBER_1
DIV CX
CMP DX,0
JNE WRONG
MOV BX,1
WRONG: MOV BX,0
CHECK ENDP
;---------------------------------------------------------------------------------------------
;This procedure get in an integer number between 0..255
;Return it to calling prog. in AX
;---------------------------------------------------------------------------------------------
GET_AN_INT_NUM PROC ;0 <= X <= 255
PUSH BX
PUSH CX
PUSH DX
XOR DX,DX
MOV TEMP_VAR,0
MOV CX,1 ;CX counts digits typed in
LOOP_2: CALL GET_A_DEC_DIGIT
CMP AL,0DH
JE EXIT_2
SUB AL,30H
XOR AH,AH
MOV DX,AX
MOV AX,TEMP_VAR
CMP CX,1
JE NOT_SUM_UP
MOV BL,10
MUL BL
NOT_SUM_UP:
ADD AX,DX
MOV TEMP_VAR,AX
INC CX
CMP CX,3
JA EXIT_2
JMP LOOP_2
EXIT_2:
MOV AX,TEMP_VAR
POP DX
POP CX
POP BX
RET
GET_AN_INT_NUM ENDP
CR_LF PROC NEAR
PUSH AX
PUSH DX
MOV AH,02
MOV DL,13
INT 21H
MOV DL,10
INT 21H
POP DX
POP AX
RET
CR_LF ENDP
;--------------------------------------------------------------------
;This procedure gets in a decimal digit between 0..9
;checks input for digit, Return it to calling prog. in AL
;--------------------------------------------------------------------
PUBLIC GET_A_DEC_DIGIT
GET_A_DEC_DIGIT PROC
PUSH DX
LOOP_1: MOV AH,08
INT 21H
CMP AL,0DH
JE EXIT_1
CMP AL,30H
JB LOOP_1
CMP AL,39H
JA LOOP_1
MOV DL,AL
MOV AH,02
INT 21H
EXIT_1: POP DX
RET
GET_A_DEC_DIGIT ENDP
CODE_SEG ENDS
END START
Ai xem hộ em nhầm nhọt chỗ nào, chạy thế quái nào cũng ra kết quả như nhau
bài toán : đọc một số nguyên 0<= x <= 255, kiểm tra xem nó có phải là một số hoàn thiện hay không (số hoàn thiện = tổng các ước số của nó, không kể chính nó)
VD: 6 = 3+2+1 => số hoàn thiện
;----------------------------------------------------------------
STACK SEGMENT STACK
DB 100H DUP('STACK')
STACK ENDS
;--------------------------------------------------------------------
DATA_SEG SEGMENT PUBLIC
MSG DB "Enter number (0 =< x <= 255):$"
MSG1 DB "a perfect number$"
MSG2 DB "not a perfect number$"
NUMBER_1 DB 0
SUM DB 0
TEMP_VAR DW 0
DATA_SEG ENDS
;--------------------------------------------------------------------
CODE_SEG SEGMENT PUBLIC
ASSUME CS:CODE_SEG, DSATA_SEG, SS: STACK
START: MOV AX,DATA_SEG
MOV DS,AX
MOV AH,09H
MOV DX,OFFSET MSG
INT 21H
CALL CR_LF
CALL GET_AN_INT_NUM
CMP Ax,255
JA EXIT
MOV NUMBER_1,AL
CALL CR_LF
MOV BX,2
DIV BX
MOV CX,AX ;cx = ax div 2
TOP: CALL CHECK
CMP BX,1
JNE NOTSUM
ADD SUM,CL
NOTSUM: ADD SUM,0
LOOP TOP
MOV AL,NUMBER_1
CMP AL,SUM
JE RIGHT
MOV AH,09H
LEA DX,MSG2
INT 21H
JMP EXIT
RIGHT: MOV AH,09H
LEA DX,MSG1
INT 21H
JMP EXIT
EXIT: MOV AH,4CH
INT 21H
CHECK PROC ; ckeck if Ax mod cx = 0 then bx = 1 elseif bx = 0
CMP CX,0
JE WRONG
XOR DX,DX
MOV AL,NUMBER_1
DIV CX
CMP DX,0
JNE WRONG
MOV BX,1
WRONG: MOV BX,0
CHECK ENDP
;---------------------------------------------------------------------------------------------
;This procedure get in an integer number between 0..255
;Return it to calling prog. in AX
;---------------------------------------------------------------------------------------------
GET_AN_INT_NUM PROC ;0 <= X <= 255
PUSH BX
PUSH CX
PUSH DX
XOR DX,DX
MOV TEMP_VAR,0
MOV CX,1 ;CX counts digits typed in
LOOP_2: CALL GET_A_DEC_DIGIT
CMP AL,0DH
JE EXIT_2
SUB AL,30H
XOR AH,AH
MOV DX,AX
MOV AX,TEMP_VAR
CMP CX,1
JE NOT_SUM_UP
MOV BL,10
MUL BL
NOT_SUM_UP:
ADD AX,DX
MOV TEMP_VAR,AX
INC CX
CMP CX,3
JA EXIT_2
JMP LOOP_2
EXIT_2:
MOV AX,TEMP_VAR
POP DX
POP CX
POP BX
RET
GET_AN_INT_NUM ENDP
CR_LF PROC NEAR
PUSH AX
PUSH DX
MOV AH,02
MOV DL,13
INT 21H
MOV DL,10
INT 21H
POP DX
POP AX
RET
CR_LF ENDP
;--------------------------------------------------------------------
;This procedure gets in a decimal digit between 0..9
;checks input for digit, Return it to calling prog. in AL
;--------------------------------------------------------------------
PUBLIC GET_A_DEC_DIGIT
GET_A_DEC_DIGIT PROC
PUSH DX
LOOP_1: MOV AH,08
INT 21H
CMP AL,0DH
JE EXIT_1
CMP AL,30H
JB LOOP_1
CMP AL,39H
JA LOOP_1
MOV DL,AL
MOV AH,02
INT 21H
EXIT_1: POP DX
RET
GET_A_DEC_DIGIT ENDP
CODE_SEG ENDS
END START
Chỉnh sửa lần cuối: