-2

問題は次のとおりです。「足し算を繰り返すことで掛け算ができるように、引き算を繰り返すことで割り算をすることもできます。数値 N1 が別の数値 N2 になる回数を計算する手順を含むプログラムを作成してください。次のことを行います。ループが必要で、そのループが実行された回数をカウントします。」私は引き算段階で本当に立ち往生しています。ループを作成する必要があることはわかっていますが、どこに配置すればよいかわかりません。

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
4

2 に答える 2

1

正の N1、N2 のアルゴリズム:

  1. prepare N1、いくつかを -1N2に設定しますR
  2. インクリメントR
  3. 減算(結果N1N2更新N2)
  4. 減算の結果がゼロ以上の場合、ステップ 2 に進みます。
  5. R整数除算の結果を持つN2/N1

ステップ 2. から 4. は、ステップごとに 1 つの命令で x86 アセンブリに書き込むことができます (sub減算が「オーバーフロー」したかどうかを判断するために使用できる更新「キャリー フラグ」 - 「Jcc」 = ジャンプのいずれかによって使用されます)。別の場所にジャンプするか、次の命令で続行するための条件コード命令)。

于 2016-10-13T11:01:10.457 に答える
0

次のプログラムが仕事をします。数値はデータ セグメント内の変数として宣言され、コメントですべてが説明されます (EMU8086 にコピー アンド ペーストして実行するだけです)。

.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  

プロシージャ "number2string" は、結果を文字列に変換するために使用されます。これは、この結果が複数の桁を持つ場合に必要です。

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

于 2016-10-13T14:26:46.610 に答える