2016-10-13 5 views
-2

質問は「何度も繰り返して掛け算することができるのと同じように、何度も減算することで分けることができます。数N1は別の数N2になります。ループが必要です。ループが実行された回数をカウントします。私は実際に減算段階に固執しています。私はループを作成する必要がありますが、どこに配置するのかわかりません。emu8086で2つの数値を減算する

org 100h 

.MODEL SMALL 
.STACK 100H 
.DATA 

MSG1 DB 'FIRST > $' 
MSG2 DB 'SECOND > $' 
MSG3 DB 'THE SUBTRACTION OF ' 
VALUE1 DB ? 
MSG4 DB ' AND ' 


VALUE2 DB ?, ' IS ' 

SUM DB ?,'.$' 

CR DB 0DH, 0AH, '$' 

.CODE 
MAIN PROC 
;INITIALIZE DS 
MOV AX, @DATA 
MOV DS, AX 
;PROMPT FOR FIRST INPUT 
LEA DX, MSG1 
MOV AH, 9H 
INT 21H 
MOV AH, 1H 
INT 21H 
MOV VALUE1, AL 
MOV BH, AL 
SUB BH, '0' 
;CARRIAGE RETURN FORM FEED 
LEA DX, CR 
MOV AH, 9H 
INT 21H 
;PROMPT FOR SECOND INPUT 
LEA DX, MSG2 
MOV AH, 9H 
INT 21H 
MOV AH, 1H 
INT 21H 
MOV VALUE2, AL 
MOV BL, AL 
SUB BL, '0' 
SUBTRACT: 
;SUB THE VALUES CONVERT TO CHARACTER AND SAVE 
SUB BH, BL 
ADD BH, '0' 
MOV SUM, BH 
;CARRIAGE RETURN FORM FEED 
LEA DX, CR 
MOV AH, 9H 
INT 21H 
;OUTPUT THE RESULT 
LEA DX, MSG3 
MOV AH, 9H 
INT 21H 


TERMINATE: 
;RETURN TO DOS 
MOV AH, 4CH 
INT 21H 
MAIN ENDP 
END MAIN 
+0

_ "どこに配置するのかわかりません" - 何らかの条件が満たされるまで、1つ以上の指示を繰り返すポイントに配置します。 – Michael

+1

'SUB BH、BL' 'ADD BH、 '0'' MOV SUM、BH'なぜ__subtraction__の結果を__addition__の結果を格納するために適切な名前で保存しますか? – Fifoernik

+1

もしあなたがそれを置くために_where_を知らなくても、おそらくあなたはこの/すべてのループを書くために_how_を知っています。あなたがこの努力を私たちに示したら、私たちは答えを提供することを奨励します。 – Fifoernik

答えて

1

正N1アルゴリズム、N2:

  1. N1を調製N2N2から一部R -1
  2. インクリメントR
  3. 減算N1セット(結果とN2を更新)
  4. 減算の結果が以上の場合ゼロ、2
  5. R 4.にステップ2.

N2/ N1整数除算の結果を有しているに進むが( sub更新が「フラグを運ぶ」ステップごとに単一の命令でのx86アセンブリ内に書き込むことができます"Jcc" =ジャンプ条件コード命令の1つが他のどこかにジャンプするか、または次の命令によって続行するために使用される)を決定するために使用することができる。

0

次のプログラムが仕事をします。番号はデータセグメント内の変数として宣言され、コメントがすべてを説明(ちょうどEMU8086にそれをコピー&ペーストして、それを実行する):場合に必要な「number2stringは」文字列に結果を変換するために使用される

.model small 
.stack 100h 
.data 

n1 dw 3 
n2 dw 95 
count dw ? 
msg db 'Quotient = $' 
str db 10 dup('$') 

.code 
    mov ax, @data 
    mov ds, ax 

;DIVIDE BY SUBTRACTIONS.    
    mov count, 0 ;COUNTER FOR SUBTRACTIONS. 
subtract: 
;CHECK IF SUBTRACTION CAN BE DONE. 
    mov ax, n1  ;COPY N1 INTO AX BECAUSE CAN... 
    cmp n2, ax  ;...NOT COMPARE MEMORY-MEMORY. 
    jl finale  ;N2 < N1. NO MORE SUBTRACTIONS. 
;SUBTRACT. 
    sub n2, ax  ;N2-N1. 
    inc count  ;INCREASE SUBTRACTIONS COUNTER. 
    jmp subtract ;REPEAT. 

finale: 
;DISPLAY MESSAGE. 
    mov ah, 9 
    mov dx, offset msg 
    int 21h 
;CONVERT QUOTIENT (COUNT) INTO STRING. 
    mov ax, count 
    mov si, offset str 
    call number2string 
;DISPLAY COUNT (QUOTIENT). 
    mov ah, 9 
    mov dx, offset str 
    int 21h 

;WAIT FOR A KEY TO BE PRESSED.   
    mov ah, 0 
    int 16h 

;EXIT. 
    mov ax, 4c00h 
    int 21h 

;------------------------------------------ 
;CONVERT A NUMBER IN STRING. 
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE 
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE 
;ORDER TO CONSTRUCT STRING (STR). 
;PARAMETERS : AX = NUMBER TO CONVERT. 
;    SI = POINTING WHERE TO STORE STRING. 

number2string proc 
    mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10. 
    mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS. 
cycle1:  
    mov dx, 0 ;NECESSARY TO DIVIDE BY BX. 
    div bx ;DX:AX/10 = AX:QUOTIENT DX:REMAINDER. 
    push dx ;PRESERVE DIGIT EXTRACTED FOR LATER. 
    inc cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED. 
    cmp ax, 0 ;IF NUMBER IS 
    jne cycle1 ;NOT ZERO, LOOP. 
;NOW RETRIEVE PUSHED DIGITS. 
cycle2: 
    pop dx   
    add dl, 48 ;CONVERT DIGIT TO CHARACTER. 
    mov [ si ], dl 
    inc si 
    loop cycle2 

    ret 
number2string endp 

手順を、この結果は2桁以上です。

数字、被除数(N2)と除数(N1)の両方がキーボードからキャプチャされないことに注意してください。これらはデータセグメント内の静的な値です。キーボードからそれらをキャプチャするためには、文字列を数値形式に変換する別の手続き "string2number"が必要です。

関連する問題