2016-11-04 2 views
0
DATA SEGMENT 
MSG1 DB 10,13,"ENTER THE FIRST NUMBER: $" 
MSG2 DB 10,13,"ENTER THE SECOND NUMBER: $" 
MSG3 DB 10,13,"ANSWER: $" 
ENDS 

CODE SEGMENT 
ASSUME DS:DATA,CS:CODE 

START: 
MOV AX,DATA 
MOV DS,AX 

LEA DX,MSG1 
MOV AH,09H 
INT 21H 

MOV AH,01H 
INT 21H 
CALL INPUT8 

MOV CL,AL 
ROL CL,04H 

MOV AH,01H 
INT 21H 
CALL INPUT8 

ADD CL,AL 

LEA DX,MSG2 
MOV AH,09H 
INT 21H 

MOV AH,01H 
INT 21H 
CALL INPUT8 

MOV BL,AL 
ROL BL,04H 

MOV AH,01H 
INT 21H 
CALL INPUT8 
ADD BL,AL 

ADD CL,BL 

MOV BL,CL 
ROL CL,04H 
AND CL,0FH 

LEA DX,MSG3 
MOV AH,09 
INT 21H 

CALL OUTPUT8 

MOV CL,BL 
AND CL,0FH 
CALL OUTPUT8 



INPUT8 PROC 

SUB AL,30H 
RET 
ENDP 

OUTPUT8 PROC 

ADD CL,30H 
MOV DL,CL 
MOV AH,02 
INT 21H 

RET 
ENDP 

MOV AH,4CH 
INT 21H 

ENDS 
END START 

출력 : 당신이 BL의 상위 4 비트를 사용하기 때문에두 번째 숫자의 두 번째 숫자를 입력해도 아무런 변화가 없습니다. 코드에 어떤 문제가 있습니까? 명령 프롬프트에서

Output in command prompt

+0

안녕하세요. 디버깅을 시도 했습니까? –

+0

'MOV AH, 09' 행에'H '가 누락되어 있다고 생각합니다. – jboockmann

+0

tasm과 tlink를 봅니다. 볼랜드는 "Turbo Debugger"도 제작했습니다. 시도해보십시오 (tasm을 구입 한 경우, 아마도 tdm을 구입했을 것입니다. 글쎄, 당신이 그것을 구입하지 않았다면, 아마도 어쩌면 당신은 SW를 훔치는 것을 고려해야한다. 어셈블러 (예를 들어 nasm)에 대한 많은 무료 교체가있다. 불행하게도 디버거에서는 그리 쉽지는 않다.) 귀하의 운영 체제에 직접. 그렇지 않은 경우 dosbox를 사용해보십시오. 디버거없이 ASM에서 코딩하는 것은 눈을 가린 로봇을 조립하는 것과 같습니다. – Ped7g

답변

0

당신은 키보드에서 문자를 캡처하고 BLCL진수 번호로 변환이 발생 한 자릿수를 누르고 두 번째 자릿수를 유지하기 위해 하위 4 비트를 십진수로 유지합니다.이 기술자는 작동하지 않습니다. 그런 다음 추가를 실행하지만 두 숫자 모두 hex이므로 결과에 문자 (A..F)가 포함될 수 있습니다. 이 경우 절차 OUTPUT8CL의 숫자가 숫자 (0..9) 또는 문자 (A..F)인지 확인해야합니다. 또한 프로그램을 끝내기위한 인터럽트가 올바른 위치에 있지 않았습니다. 다음은 두 가지 수정 사항입니다.

DATA SEGMENT 
MSG1 DB 10,13,"ENTER THE FIRST NUMBER: $" 
MSG2 DB 10,13,"ENTER THE SECOND NUMBER: $" 
MSG3 DB 10,13,"ANSWER: $" 
ENDS 

CODE SEGMENT 
ASSUME DS:DATA,CS:CODE 

START: 
MOV AX,DATA 
MOV DS,AX 

LEA DX,MSG1 
MOV AH,09H 
INT 21H 

MOV AH,01H 
INT 21H 
CALL INPUT8 

MOV CL,AL 
ROL CL,04H 

MOV AH,01H 
INT 21H 
CALL INPUT8 

ADD CL,AL 

LEA DX,MSG2 
MOV AH,09H 
INT 21H 

MOV AH,01H 
INT 21H 
CALL INPUT8 

MOV BL,AL 
ROL BL,04H 

MOV AH,01H 
INT 21H 
CALL INPUT8 
ADD BL,AL 

ADD CL,BL 

MOV BL,CL 
ROL CL,04H 
AND CL,0FH 

LEA DX,MSG3 
MOV AH,09 
INT 21H 

CALL OUTPUT8 

MOV CL,BL 
AND CL,0FH 
CALL OUTPUT8 

MOV AH,4CH    ;◄■■ THIS CODE COMES FROM 
INT 21H    ;◄■■ 26 LINES BELOW. 

INPUT8 PROC 

SUB AL,30H 
RET 
ENDP 

OUTPUT8 PROC 
cmp cl,9     ;◄■■ IF CL <= 9 
jbe digit     ;◄■■ JUMP TO "DIGIT". 
          ;◄■■ NO JUMP IF CL > 9. 
;IF NUMBER IS LETTER (A..F). ◄■■ 
add cl, 57h     ;◄■■ CONVERT 10..15 TO 'A'..'F'. 
jmp output8display   ;◄■■ SKIP THE "DIGIT" BLOCK. 

;IF NUMBER IS DIGIT (0..9). ;◄■■ 
digit:      ;◄■■ 
ADD CL,30H 

output8display:    ;◄■■ DISPLAY CL (DIGIT OR LETTER). 
MOV DL,CL 
MOV AH,02 
INT 21H 
output8end: 
RET 
ENDP 

;MOV AH,4CH    ;◄■■ THIS CODE SHOULD 
;INT 21H    ;◄■■ BE 26 LINES ABOVE. 

ENDS 
END START