2016-10-13 5 views
-2

Вопрос гласит: «Так же, как можно умножать, добавляя снова и снова, можно разделить путем вычитания снова и снова. Напишите программу с процедурой, чтобы вычислить, сколько раз номер N1 переходит в другое число N2. Вам понадобится цикл и подсчитывается, сколько раз этот цикл выполняется ». Я действительно застрял на этапе вычитания. Я знаю, что мне нужно создать цикл, но я не знаю, где его разместить.Деление двух чисел на вычитание в emu8086

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

_ "но я не знаю, где его разместить" _ Вы поместите его в том месте, где вы хотите повторить одну или несколько инструкций, пока не будет выполнено какое-либо условие. – Michael

+1

'SUB BH, BL'' ADD BH, '0''' MOV SUM, BH' Зачем вам хранить результат __subtraction__ в переменной, подходящей для хранения результата __addition__? – Fifoernik

+1

Даже если вы не знаете _where_, чтобы поместить его, возможно, вы знаете _how_, чтобы написать этот/любой цикл. Это побудило бы нас дать ответ, если бы вы продемонстрировали нам эти усилия. – Fifoernik

ответ

1

Алгоритм для положительного N1, N2:

  1. готовят N1, N2 и установить некоторые R -1
  2. Приращение R
  3. вычесть N1 из N2 (обновление N2 с результатом)
  4. , когда результат вычитания выше или равен нулю, перейдите к шагу 2.
  5. R имеет результат целочисленного деления N2/N1

шаги 2. 4. могут быть записаны в x86 Ассамблеи по одной инструкции за один шаг (в sub обновления «несут флаг» , который может быть использован для определения того, что вычитание «переполнения» - используется одной из инструкций «Jcc» = код перехода для перехода в другое место или продолжается следующей инструкцией).

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», чтобы преобразовать строки в числовой формат.

Смежные вопросы