Assembly 在emu8086中用减法除两个数
这个问题是这样的:“正如可以通过反复加法进行乘法一样,也可以通过反复减法进行除法。编写一个程序,用一个过程来计算一个数N1到另一个数N2的次数。你需要一个循环,并计算该循环执行的次数。”。我真的被困在减法阶段。我知道我必须创建一个循环,但我不知道放在哪里Assembly 在emu8086中用减法除两个数,assembly,emu8086,Assembly,Emu8086,这个问题是这样的:“正如可以通过反复加法进行乘法一样,也可以通过反复减法进行除法。编写一个程序,用一个过程来计算一个数N1到另一个数N2的次数。你需要一个循环,并计算该循环执行的次数。”。我真的被困在减法阶段。我知道我必须创建一个循环,但我不知道放在哪里 org 100h .MODEL SMALL .STACK 100H .DATA MSG1 DB 'FIRST > $' MSG2 DB 'SECOND > $' MSG3 DB 'THE SUBTRACTION OF ' VAL
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
正N1、N2的算法:
N1
,N2
并将一些R
设置为-1R
N2
中减去N1
(使用结果更新N2
)R
具有整数除法的结果N2
/N1
步骤2。到4。可以通过每一步的单个指令在x86汇编中写入(sub更新“进位标志”,该标志可用于确定减法是否“溢出”——由其中一条“Jcc”=跳转条件代码指令使用,以跳转到其他地方或按下一条指令继续)。下一个程序执行此任务。这些数字在数据段中声明为变量,注释解释了一切(只需将其复制粘贴到EMU8086中并运行即可):
。型号小
.烟囱100小时
.数据
n1 dw 3
n2 dw 95
德瓦伯爵?
msg db'商=$'
str db 10 dup(“$”)
.代码
mov-ax,@data
mov-ds,ax
;除以减法。
mov计数,0;减法计数器。
减去:
;检查是否可以进行减法运算。
mov-ax,n1;将N1复制到AX中,因为可以。。。
化学机械抛光n2,ax;。。。不比较内存和内存。
jl结局;N2
过程“number2string”用于将结果转换为字符串,如果此结果包含多个数字,则需要进行转换
请注意,这两个数字,被除数(N2)和除数(N1)都不是从键盘捕获的,它们是数据段中的静态值。为了从键盘上捕获它们,我们需要另一个过程“string2number”,将字符串转换成数字格式。“但我不知道放在哪里”您将它放在您希望重复一条或多条指令的位置,直到满足某些条件。
SUB BH,BL
添加BH,'0'
MOV SUM,BH
为什么要将减法运算的结果存储在一个恰当命名的变量中以存储加法运算的结果?即使您不知道将其放置在何处,也许您知道如何编写这个/任何循环。如果您向我们展示这一努力,我们将鼓励您提供答案。
.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