大会 - 如何做两个数字之间的总和(间隔) [英] ASSEMBLY - how to do sum between two numbers(interval)
问题描述
嗨你能帮忙吗?我不知道如何把两个数字之间做总和
例如:
第一个号码> 1
第二号> 5
之会> 1 + 2 + 3 + 4 + 5 = 15
我做了两个数字的总和只。我不知道如何做到这一点的序列号,我的code如下。谢谢
MAIN:
MOV AX,SEG数据
MOV DS,AX MOV啊,9H;味精第一号
LEA DX,味精
INT 21H MOV啊,1H;读取字符
INT 21H 子等,'0';带ASCII
MOV X,人;存储第一号 MOV啊,9H;味精第二个数字
LEA DX,MSG 2
INT 21H MOV啊,1H;读取字符
INT 21H 子等,0
MOV Y,人;存储第二个号码 MOV啊,9H;味精总和
LEA DX,消息3
INT 21H MOV DL,X
添加DL,Y
添加DL,'0'; X + Y MOV啊,2H;印花
INT 21H
MOV AX,4C00H;结束
INT 21Hcode ENDS
END MAIN
下面是EMU8086解决方案:
.STACK 100H。数据msj1 DB输入第一个数字:$'msj2 DB输入第二个数字:$'NUM1 DW? ;区间的第一个数字。NUM2 DW? ;区间的第二个数字。海峡6分贝;性状的最大数量允许的(4)。
DB? ;进入了用户的字符数。
DB 6 DUP(?);进入了用户特征。CRLF分贝13,10,$;换行。加上DB'+ $';加号可显示。回到分贝8,$,光标移动一个地方BACK(向左)。ekual DB = $';等号显示。SUMA DW 0之间; NUM1 NUM2和所有数字SUMATORY。。code;初始化数据段。
MOV AX,@data
MOV DS,AX;显示消息第一个数字。
MOV啊,9
MOV DX,偏移msj1
INT 21H; CAPTURE号码STRING。
MOV啊,0AH
MOV DX,偏移海峡
INT 21H; CONVERT CAPTURED数量从字符串到数字。
MOV SI,偏移海峡;参数FOR STRING2NUMBER。
电话string2number
MOV NUM1,BX;返回的值。;显示两个换行符。
MOV啊,9
MOV DX,偏移CRLF
INT 21H MOV啊,9
MOV DX,偏移CRLF
INT 21H;显示消息第二个数字。
MOV啊,9
MOV DX,偏移msj2
INT 21H; CAPTURE号码STRING。
MOV啊,0AH
MOV DX,偏移海峡
INT 21H; CONVERT CAPTURED数量从字符串到数字。
MOV SI,偏移海峡;参数FOR STRING2NUMBER。
电话string2number
MOV NUM2,BX;返回的值。;显示两个换行符。
MOV啊,9
MOV DX,偏移CRLF
INT 21H MOV啊,9
MOV DX,偏移CRLF
INT 21H; ASURE第一个数字是小于第二个。
MOV AX,NUM1
CMP斧,NUM2
JBE罚款; AX< NUM2 JUMP罚款。
XCHG斧,NUM2;交易所:NUM2 = AX,AX = NUM2。
MOV NUM1,斧头; NUM1 = NUM2。
精细:;显示间隔。
调用display_interval;等到USER $ P $干燥综合征任意键。
MOV啊,7
INT 21H; FINISH程序。
MOV AX,4c00h
INT 21H; ------------------------------------------
;显示器之间NUM1 NUM2和所有号码
;分离 - '+',并显示SUMPROC display_interval间隔:
;添加当前号码SUMA。
MOV AX,NUM1; AX =当前数目。
添加SUMA,斧
;将电流转换号码字符串显示。
拨打美元; FILLSTRWITH$。需要显示。
调用number2string;参数= AX。返回变量STR。
;显示编号转换成字符串。
MOV啊,9
MOV DX,偏移海峡
INT 21H
;显示加号。
MOV啊,9
MOV DX,抵消加
INT 21H
;其次要显示的号码。
INC NUM1
MOV AX,NUM1
CMP斧,NUM2
JBE区间;如果AX< = NUM2然后重复。;显示SUMA。; DISPLAY Backspace键(删除上一个加号)。
MOV啊,9
MOV DX,抵消回
INT 21H;显示了等号。
MOV啊,9
MOV DX,偏移ekual
INT 21H; CONVERT SUMA成字符串来显示它。
拨打美元; FILLSTRWITH$。需要显示。
MOV AX,SUMA
调用number2string;参数= AX。返回变量STR。;显示编号转换成字符串。
MOV啊,9
MOV DX,偏移海峡
INT 21H RET
ENDP; ------------------------------------------
;字符串转换为数目BX。
; SI必须输入指向字符串。PROC string2number
;使SI指向最低位。
INC SI;点输入的字符数。
MOV CL,[SI];输入的字符数。
MOV CH,0;清CH,NOW CX == CL。
加SI,CX; NOW SI点,最低位。
;字符串转换。
MOV BX,0
MOV BP,1;多的10乘以每个数字。
重复:
;转换Character。
MOV人,[SI];性格进行处理。
子人,48; CONVERT ASCII字符的数字。
MOV啊,0;清啊,现在AX == AL。
MUL BP; AX * BP = DX:AX。
加BX,AX; ADD结果BX。
;第10(1,10,100 ...)可增加多。
MOV AX,BP
MOV BP,10
MUL BP; AX * 10 = DX:AX。
MOV BP,斧头;新的多的10。
;检查是否我们已经完成。
十二月SI;下一个数字进行处理。
循环重复;计数器CX-1,如果不为零,重复。 RET
ENDP; ------------------------------------------
;充满变量STR与$。
;使用前将数字转换成字符串,因
;字符串将被显示。PROC美元
MOV SI,偏移海峡
MOV CX,6
six_dollars:
MOV BL,$
MOV [SI],BL
INC SI
环six_dollars RET
ENDP; ------------------------------------------
; NUMBER转换必须输入AX。
;算法:EXTRACT DIGITS一个接一个,STORE
;其中堆栈,然后提取按相反
;为了构建STRING(STR)。PROC number2string
MOV BX,10; DIGITS提取除以10。
MOV CX,0;柜台浸提数字。
CYCLE1:
MOV DX,0;要除以BX。
DIV BX; DX:AX / 10 = AX:QUOTIENT DX:余数。
推DX; preSERVE DIGIT提取更高版本。
INC CX;增加柜台临界萃取每个数字。
CMP AX,0;如果number
JNE CYCLE1;不为零,LOOP。
;立即检索PUSHED数字。
MOV SI,偏移海峡
循环2:
流行的DX
添加DL,48; CONVERT一位数字字符。
MOV [SI],DL
INC SI
循环循环2 RET
ENDP
接下来就是你的code。与一些变化,现在它从堆栈两个参数并在内部将它们放在变量NUM1 NUM2和。我不会考虑为所有打印的参数护理:
PROC display_interval; RETRIEVE参数。
流行AX;返回地址。
流行NUM2; NUM2。
流行NUM1; NUM1。
推AX;返回地址BACK(必要FORRET)。 打印MSG4
间隔:
;添加当前号码SUMA。
MOV AX,X; AX =当前数目。
添加K,斧
;将电流转换号码字符串显示。
拨打美元; FILLSTRWITH$。需要显示。
调用number2string;参数= AX。返回变量STR。
;显示编号转换成字符串。
MOV啊,9
MOV DX,偏移海峡
INT 21H
;显示加号。
MOV啊,9
MOV DX,抵消加
INT 21H
;其次要显示的号码。
INC点¯x
MOV AX,X
CMP AX,Y
JBE区间;如果AX< = NUM2然后重复。 ;显示SUMA。 ; DISPLAY Backspace键(删除上一个加号)。
背面打印 ;显示了等号。
打印平等 ; CONVERT SUMA成字符串来显示它。
拨打美元; FILLSTRWITH$。需要显示。
MOV AX,K
调用number2string;参数= AX。返回变量STR。 ;显示编号转换成字符串。
MOV啊,9
MOV DX,偏移海峡
INT 21H RET
ENDP
程序display_interval应该被称为是这样的:
MOV AX,1
推斧;第一个参数。
MOV AX,5
推斧;第二个参数。
调用display_interval
Hey guys can you help? I dont know how to do sum between two numbers For example :
first number>1
second number>5
sum would be > 1+2+3+4+5 = 15
I did only sum of two numbers. I dont know how to do this number sequences, my code is below. Thank you
MAIN:
MOV AX, SEG DATA
MOV DS,AX
mov ah, 9h ; msg for first number
lea dx, msg
int 21H
mov ah, 1h ; read char
int 21H
sub al, '0' ; strip ASCII
mov x, al ; storing first number
mov ah, 9h ; msg for second number
lea dx, msg2
int 21H
mov ah, 1h ; read char
int 21H
sub al, '0'
mov y, al ; storing second number
mov ah, 9h ; msg for sum
lea dx, msg3
int 21H
mov dl, x
add dl, y
add dl, '0' ; x + y
mov ah, 2h ; printing
int 21H
MOV AX,4C00H ;end
INT 21H
CODE ENDS
END MAIN
Here is the solution for EMU8086 :
.stack 100h
.data
msj1 db 'Enter first number: $'
msj2 db 'Enter second number: $'
num1 dw ? ;FIRST NUMBER OF INTERVAL.
num2 dw ? ;SECOND NUMBER OF INTERVAL.
str db 6 ;MAX NUMBER OF CHARACTERS ALLOWED (4).
db ? ;NUMBER OF CHARACTERS ENTERED BY USER.
db 6 dup (?) ;CHARACTERS ENTERED BY USER.
crlf db 13,10,'$' ;LINE BREAK.
plus db '+$' ;PLUS SIGN TO DISPLAY.
back db 8,'$' ;CURSOR WILL MOVE ONE PLACE BACK (TO THE LEFT).
ekual db '=$' ;EQUAL SIGN TO DISPLAY.
suma dw 0 ;SUMATORY OF ALL NUMBERS BETWEEN NUM1 AND NUM2.
.code
;INITIALIZE DATA SEGMENT.
mov ax, @data
mov ds, ax
;DISPLAY MESSAGE FOR FIRST NUMBER.
mov ah, 9
mov dx, offset msj1
int 21h
;CAPTURE NUMBER AS STRING.
mov ah, 0Ah
mov dx, offset str
int 21h
;CONVERT CAPTURED NUMBER FROM STRING TO NUMERIC.
mov si, offset str ;PARAMETER FOR STRING2NUMBER.
call string2number
mov num1, bx ;RETURNED VALUE.
;DISPLAY TWO LINE BREAKS.
mov ah, 9
mov dx, offset crlf
int 21h
mov ah, 9
mov dx, offset crlf
int 21h
;DISPLAY MESSAGE FOR SECOND NUMBER.
mov ah, 9
mov dx, offset msj2
int 21h
;CAPTURE NUMBER AS STRING.
mov ah, 0Ah
mov dx, offset str
int 21h
;CONVERT CAPTURED NUMBER FROM STRING TO NUMERIC.
mov si, offset str ;PARAMETER FOR STRING2NUMBER.
call string2number
mov num2, bx ;RETURNED VALUE.
;DISPLAY TWO LINE BREAKS.
mov ah, 9
mov dx, offset crlf
int 21h
mov ah, 9
mov dx, offset crlf
int 21h
;ASURE FIRST NUMBER IS LESS THAN THE SECOND.
mov ax, num1
cmp ax, num2
jbe fine ;IF AX < NUM2 JUMP FINE.
xchg ax, num2 ;EXCHANGE : NUM2=AX, AX=NUM2.
mov num1, ax ;NUM1=NUM2.
fine:
;DISPLAY THE INTERVAL.
call display_interval
;WAIT UNTIL USER PRESS ANY KEY.
mov ah,7
int 21h
;FINISH PROGRAM.
mov ax, 4c00h
int 21h
;------------------------------------------
;DISPLAY ALL NUMBERS BETWEEN NUM1 AND NUM2
;SEPARATED BY '+' AND DISPLAYS THE SUM
proc display_interval
interval:
;ADD CURRENT NUMBER TO SUMA.
mov ax, num1 ;AX = CURRENT NUMBER.
add suma, ax
;CONVERT CURRENT NUMBER TO STRING TO DISPLAY IT.
call dollars ;FILL "STR" WITH '$'. NEEDED TO DISPLAY.
call number2string ;PARAMETER = AX. RETURNS IN VARIABLE "STR".
;DISPLAY NUMBER CONVERTED TO STRING.
mov ah, 9
mov dx, offset str
int 21h
;DISPLAY PLUS SIGN.
mov ah, 9
mov dx, offset plus
int 21h
;NEXT NUMBER TO DISPLAY.
inc num1
mov ax, num1
cmp ax, num2
jbe interval ;IF AX <= NUM2 THEN REPEAT.
;DISPLAY THE SUMA.
;DISPLAY BACKSPACE (TO DELETE LAST PLUS SIGN).
mov ah, 9
mov dx, offset back
int 21h
;DISPLAY EQUAL SIGN.
mov ah, 9
mov dx, offset ekual
int 21h
;CONVERT SUMA TO STRING TO DISPLAY IT.
call dollars ;FILL "STR" WITH '$'. NEEDED TO DISPLAY.
mov ax, suma
call number2string ;PARAMETER = AX. RETURNS IN VARIABLE "STR".
;DISPLAY NUMBER CONVERTED TO STRING.
mov ah, 9
mov dx, offset str
int 21h
ret
endp
;------------------------------------------
;CONVERT STRING TO NUMBER IN BX.
;SI MUST ENTER POINTING TO THE STRING.
proc string2number
;MAKE SI TO POINT TO THE LEAST SIGNIFICANT DIGIT.
inc si ;POINTS TO THE NUMBER OF CHARACTERS ENTERED.
mov cl, [ si ] ;NUMBER OF CHARACTERS ENTERED.
mov ch, 0 ;CLEAR CH, NOW CX==CL.
add si, cx ;NOW SI POINTS TO LEAST SIGNIFICANT DIGIT.
;CONVERT STRING.
mov bx, 0
mov bp, 1 ;MULTIPLE OF 10 TO MULTIPLY EVERY DIGIT.
repeat:
;CONVERT CHARACTER.
mov al, [ si ] ;CHARACTER TO PROCESS.
sub al, 48 ;CONVERT ASCII CHARACTER TO DIGIT.
mov ah, 0 ;CLEAR AH, NOW AX==AL.
mul bp ;AX*BP = DX:AX.
add bx,ax ;ADD RESULT TO BX.
;INCREASE MULTIPLE OF 10 (1, 10, 100...).
mov ax, bp
mov bp, 10
mul bp ;AX*10 = DX:AX.
mov bp, ax ;NEW MULTIPLE OF 10.
;CHECK IF WE HAVE FINISHED.
dec si ;NEXT DIGIT TO PROCESS.
loop repeat ;COUNTER CX-1, IF NOT ZERO, REPEAT.
ret
endp
;------------------------------------------
;FILLS VARIABLE STR WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.
proc dollars
mov si, offset str
mov cx, 6
six_dollars:
mov bl, '$'
mov [ si ], bl
inc si
loop six_dollars
ret
endp
;------------------------------------------
;NUMBER TO CONVERT MUST ENTER IN AX.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (STR).
proc number2string
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.
mov si, offset str
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2
ret
endp
Next is your code with some changes, now it takes two parameters from stack and internally puts them in variables num1 and num2. I'm not taking care of the parameters for all the "print" :
proc display_interval
;RETRIEVE PARAMETERS.
pop ax ;RETURN ADDRESS.
pop num2 ;NUM2.
pop num1 ;NUM1.
push ax ;RETURN ADDRESS BACK (NECESSARY FOR "RET").
print msg4
interval:
;ADD CURRENT NUMBER TO SUMA.
mov ax, x ;AX = CURRENT NUMBER.
add k, ax
;CONVERT CURRENT NUMBER TO STRING TO DISPLAY IT.
call dollars ;FILL "STR" WITH '$'. NEEDED TO DISPLAY.
call number2string ;PARAMETER = AX. RETURNS IN VARIABLE "STR".
;DISPLAY NUMBER CONVERTED TO STRING.
mov ah, 9
mov dx, offset str
int 21h
;DISPLAY PLUS SIGN.
mov ah, 9
mov dx, offset plus
int 21h
;NEXT NUMBER TO DISPLAY.
inc x
mov ax, x
cmp ax, y
jbe interval ;IF AX <= NUM2 THEN REPEAT.
;DISPLAY THE SUMA.
;DISPLAY BACKSPACE (TO DELETE LAST PLUS SIGN).
print back
;DISPLAY EQUAL SIGN.
print equal
;CONVERT SUMA TO STRING TO DISPLAY IT.
call dollars ;FILL "STR" WITH '$'. NEEDED TO DISPLAY.
mov ax, k
call number2string ;PARAMETER = AX. RETURNS IN VARIABLE "STR".
;DISPLAY NUMBER CONVERTED TO STRING.
mov ah, 9
mov dx, offset str
int 21h
ret
endp
Procedure "display_interval" should be called like this :
mov ax, 1
push ax ;FIRST PARAMETER.
mov ax, 5
push ax ;SECOND PARAMETER.
call display_interval
这篇关于大会 - 如何做两个数字之间的总和(间隔)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!