2016-11-04 8 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 

出力:2番目の数字の2桁目を入力しても何も起こりません。コードの何が間違っていますか?コマンドプロンプトで

Output in command prompt

+0

ようこそ。あなたはデバッグを試みましたか? –

+0

'MOV AH、09'に' H'がありません。 – jboockmann

+0

私はtasmとtlinkを参照しています...ボーランドも "Turbo Debugger"を作りました。試してみてください。あなたがそれを購入していないなら、多分あなたはSWを盗むのをやめて、アセンブラ(例えばnasm)のための多くの自由な置き換えがあると考えるべきです。あなたのOSを直接。そうでない場合は、dosboxを試してください。デバッガなしでASM内の何かをコーディングすることは、目隠しされたロボットを組み立てることです。 – Ped7g

答えて

0

あなたは、キーボードから文字をキャプチャし、16進数BLCLに変換し、あなたがBLの上位4ビットにを使用しているので、これは起こります1桁を保持し、下位4ビットは2桁目を保持しますが、このテクニンクは機能しません。その後、加算を実行しますが、両方の数値はです。結果には文字(A..F)が含まれる可能性があります。その場合、手順OUTPUT8は、CLの数字が数字(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 
関連する問題