大会 - 如何做两个数字之间的总和(间隔) [英] ASSEMBLY - how to do sum between two numbers(interval)

查看:175
本文介绍了大会 - 如何做两个数字之间的总和(间隔)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嗨你能帮忙吗?我不知道如何把两个数字之间做总和
例如:

第一个号码> 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 = NUM​​2。
  MOV NUM1,斧头; NUM1 = NUM​​2。
精细:;显示间隔。
  调用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< = NUM​​2然后重复。;显示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< = NUM​​2然后重复。    ;显示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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆