5
.MODEL SMALL
.STACK 1000
.DATA

MSGA DB 13,10,"Input first number: ","$"
MSGB DB 13,10,"Input second number:","$"
MSGC DB 13,10,"The sum is: ","$"

NUM1 db ?
NUM2 db ?
NUM3 db ?

.CODE

MAIN PROC NEAR

MOV AX, @DATA
MOV DS, AX

; get first number
LEA DX, MSGA
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV BL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV CL, AL

; get second number
LEA DX, MSGB
MOV AH, 09h
INT 21h

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DL, AL

MOV AH, 01
INT 21H
SUB AL, '0'

MOV DH, AL

; add
ADD CL, DH 
ADC BL, DL
MOV NUM1, CL
ADD NUM1, '0'
MOV NUM2, BL
ADD NUM2, '0'

; output sum
LEA DX, MSGC
MOV AH, 09h
INT 21h

MOV DL, NUM2
MOV AH, 02H
INT 21h

MOV DL, NUM1
MOV AH, 02H
INT 21h

MOV AH, 4Ch
INT 21h

MAIN ENDP
END MAIN

上記は、アセンブリに 2 つの 2 桁の数字を追加するための私のコードです。なぜADCが機能しないのだろうか。1 の桁が追加されたときにキャリーが得られない場合、私のコードは機能します。しかし、そうでなければそうではありません。ADC の実際の機能を誤解していませんか? コードはどうすればよいですか?

4

2 に答える 2

4

10 進法を使用しているように見えますが、使用していませんAAAADC期待どおりの動作をしますが、そのコードでは、最初の加算からの実際のキャリーはありません (結局のところ、9+9 は 255 よりも大きくありません)。

したがって、もちろん、解決策は次のAAAように を使用することです(テストされていません):

add al,dl
aaa        ; takes no arguments and works on al
add ah,dh  ; adc not necessary, aaa already incremented ah if there was a carry

AAA( ASCII Adjust for Additional )が 9 より大きいかどうかをテストし、そうである場合:

  • 調整しますal
  • キャリーフラグをセットし、
  • 増分ah
于 2012-07-19T14:39:59.067 に答える
1

ここでこの質問をチェックしてくださいSO答えは、ADC - Add with Carry がどのように機能するかを説明しています。基本的に、単純な ADD 命令を使用して、最初に下位バイトを加算する必要があります。次に、下位バイトの加算でキャリーが生成された場合にキャリーを追加する ADC (キャリー付き加算) を使用して上位バイトを加算します。

たとえば、AX と BX を追加する場合は、次のようにします。

add  al, bl
adc  ah, bh   ; include the carry if previous add generated one

あなたの質問へのコメントが述べたように、実際には各ASCII文字を取得してから「0」を減算することにより、10進数演算を実行しています。これらの各操作は、8 ビット レジスタに格納される 0 ~ 9 の 2 進数のみを生成します。コメントにあるように、それぞれが 10 未満の 2 つの数値を加算しても、結果が 256 より大きい場合にのみ発生する可能性があるキャリーにはなりません。

このタスクを実行する方法を引き続き使用する場合は、加算の結果が 10 より大きいかどうか、および 10 を引くかどうかをチェックして、下位 2 桁の 10 進数の加算がキャリーを引き起こしているかどうかを手動でチェックする必要があります。数から計算し、上位桁の計算に 1 を追加します。

それは理にかなっていますか?

これは宿題ですか?もしそうなら、課題の目的はキャリーの仕組みを学ぶことですか、それとも 2 つの 2 桁の数字を足し合わせるプログラムを書くことですか?

于 2012-07-19T14:31:27.903 に答える