用汇编语言实现如下程序:进行自然数相加(1+2+3+……+N)。必须利用循环指令。

另:如果(无符号整数的)累加和用一个32位寄存器存储,求出有效累加和的最大值及N的界限。
呵呵,C我也会……但纠结的就是现在是汇编……哎

@N 的极限是92681。  以下程序将其赋值 100000 时,它返回的为92681。
当你给定的@N 在92681以内时,它会输出自然数累加结果。
(程序是用16位的寄存器实现,比32位的寄存器实现要复杂很多 !)

        CODE  SEGMENT
              ASSUME    CS:CODE
          @N  DD        100000
      START:
              PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              MOV       AX,0
              MOV       DX,0
              MOV       SI,0
              MOV       DI,0
              MOV       CX,WORD PTR @N
              MOV       BX,WORD PTR @N+2
         @0:
              ADD       AX,SI
              ADC       DX,DI
              JC        @ERR
              ADD       SI,1
              ADC       DI,0
              SUB       CX,1
              JNC       @0
              SBB       BX,0
              JNC       @0
              CALL      DISPDXAX
              
      @EXIT:
              MOV       AH,4CH
              INT       21H
              
       @ERR:
              SUB       SI,1
              SBB       DI,0
              MOV       AX,SI
              MOV       DX,DI
              CALL      DISPDXAX
              JMP       @EXIT

 
    DISPDXAX  PROC      NEAR
    ; 将要显示的32位无符号数置于dx、ax中    
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSH      BP
              PUSHF
              MOV       WORD PTR [Y],AX
              MOV       WORD PTR [Y+2],DX
              MOV       AX,WORD PTR [Y]
              MOV       DX,WORD PTR [Y+2]
              MOV       BX,WORD PTR [Z]
              MOV       CX,WORD PTR [Z+2]
              MOV       WORD PTR N,0
        MM0:  INC       WORD PTR N
              SUB       AX,BX
              SBB       DX,CX
              JNC       MM0
              DEC       WORD PTR N
              ADD       AX,BX
              ADC       DX,CX
              MOV       WORD PTR[Y],AX
              MOV       WORD PTR[Y+2],DX
        MM1:  LEA       DI,CC
              ADD       DI,9
         M2:
              MOV       AX,WORD PTR [Y]
              MOV       DX,WORD PTR [Y+2]
              MOV       BX,10000
              DIV       BX
              PUSH      AX
              PUSH      DX
              POP       DX
              MOV       CX,4
              MOV       AX,DX
         M3:  MOV       DX,0
              MOV       BX,10
              DIV       BX
              ADD       DL,30H
              MOV       [DI],DL
              DEC       DI
              LOOP      M3
              POP       AX
              MOV       CX,1
         M4:  MOV       DX,0
              MOV       BX,10
              DIV       BX
              ADD       DL,30H
              MOV       [DI],DL
              DEC       DI
              LOOP      M4
              MOV       AX,WORD PTR N
              MOV       CX,5
         M5:  MOV       DX,0
              MOV       BX,10
              DIV       BX
              ADD       DL,30H
              MOV       [DI],DL
              DEC       DI
              LOOP      M5
              LEA       DX,LFCR
              MOV       AH,9
              INT       21H
              MOV       CX,9
              LEA       SI,CC
         M6:
              MOV       AL,[SI]
              CMP       AL,'0'
              JNE       M7
              MOV       BYTE PTR [SI],32
              INC       SI
              LOOP      M6
         M7:
              LEA       DX,CC
              MOV       AH,9
              INT       21H
              POPF
              POP       BP
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
           Y  DD        ?
          CC  DB        10 DUP(' '),10,13,'$'
        LFCR  DB        10,13,'$'
           Z  DD        100000
           N  DW        0
    DISPDXAX  ENDP

        CODE  ENDS
              END       START

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-05
mov ecx , N
mov eax , 1
loop1:
add eax , ecx
loop loop1

完成。
界限当然是32位无符号数的表示范围了,就是0xffff ffff本回答被提问者采纳
第2个回答  2010-05-05
汇编?
C可以吗?
mian()
{float sum,t,n;
sum=0;t=0;
scanf(%f",&n);
for(t=1;t<=n;t++)
sum=sum+t;
printf("%f",sum);
}
将上述程序编译得到汇编文件
相似回答