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

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

@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

code  segment

      assume cs:code

      org 100h

start:jmp begin

begin:push cs

      pop ds

      push cs

      pop es

      mov cx,100

      mov ax,0

      mov bx,1

again:

      add ax,bx

      call dispaxs

      push ax

      push dx

      mov ah,2

      mov dl,13

      int 21h

      mov dl,10

      int 21h

      pop dx

      pop ax

      inc bx

      loop again

      

      mov ah,4ch

      int 21h

      

;=========================================

 ; 将要显示的有符号数置于 ax 中

     DISPAXS  PROC      NEAR

              PUSH      AX

              PUSH      BX

              PUSH      CX

              PUSH      DX

              PUSH      SI

              PUSH      DI

              PUSH      BP

              PUSH      DS

              PUSH      ES

              PUSHF

              PUSH      CS

              POP       DS

              PUSH      CS

              POP       ES

              MOV       CX,6

              LEA       DI,DISPAXSS

   @DISPAXS:

              MOV       BYTE PTR [DI],32

              INC       DI

              LOOP      @DISPAXS

              PUSH      AX

              MOV       DL,32

              MOV       AH,2

              INT       21H

              POP       AX

              MOV       BYTE PTR NZS,0

              MOV       BYTE PTR SIGNS,0

              CMP       AX,0

              JGE       @DISPAXS0

              MOV       BYTE PTR SIGNS,1

              NEG       AX

  @DISPAXS0:

              PUSH      AX

              LEA       SI,DIVARRS

              LEA       DI,DISPAXSS

              INC       DI

              MOV       CX,5

  @DISPAXS1:

              POP       AX

              MOV       DX,0

              MOV       BX,[SI]

              DIV       BX

              PUSH      DX

              CMP       AL,0

              JNE       @DISPAXS2

              CMP       BYTE PTR NZS,1

              JE        @DISPAXS2

              CMP       CX,1

              JE        @DISPAXS2

              MOV       DL,20H

              JMP       @DISPAXS3

  @DISPAXS2:

              ADD       AL,30H

              MOV       DL,AL

              MOV       BYTE PTR NZS,1

  @DISPAXS3:

              MOV       BYTE PTR[DI],DL

              INC       SI

              INC       SI

              INC       DI

              LOOP      @DISPAXS1

              POP       DX

              CMP       BYTE PTR SIGNS,1

              JNE       @DISPAXS6

              LEA       SI,DISPAXSS

              ADD       SI,5

  @DISPAXS4:

              CMP       BYTE PTR [SI],32

              JE        @DISPAXS5

              DEC       SI

              JMP       @DISPAXS4

  @DISPAXS5:

              MOV       BYTE PTR [SI],'-'

  @DISPAXS6:

              LEA       DX,DISPAXSS

              MOV       AH,9

              INT       21H

              POPF

              POP       ES

              POP       DS

              POP       BP

              POP       DI

              POP       SI

              POP       DX

              POP       CX

              POP       BX

              POP       AX

              RET

     DIVARRS  DW        10000,1000,100,10,1

         NZS  DB        0

       SIGNS  DB        0

    DISPAXSS  DB        32,32,32,32,32,32,'$'

     DISPAXS  ENDP

;==================================

code  ends

      end start

int num=1;

int sum=0;

while(sum<=1000)

{

sum=sum+num;

num++;

}

num为自然数;sum为总和;

够懒的,几句指令,写一下发上来多好,贴图印象分就直线降低了。说一下答案吧:

第一:MOV

A,#0FEH,这条指令执行后,累加器A的值为:FEH

第二:ADD

A,#0FEH,续上条指令,该指令执行后,累加器A的值为:FCH

第三:MOV

A,#09H,该指令执行后,累加器A的值为:09H

第四:MOV

PSW,#0,该指令不影响累加器A的值

第五:subb

a,#0A4H,执行该指令后,累计爱器A的值为:65H

将一个存储空间设置为1,预先留两个存储空间,一个用来做加数,一个用来做和数。这个程序需要循环,50次。

第一条指令是设置一个循环标示,

第二条指令存将初值为1的存储空间的数取出存入加数的存储空间。

第三条指令初值为1的那个空间自增1,相加后存到和数中去。

第四条指令,判断循环是否需要结束。

扩展资料:

汇编语言具有更高的机器相关性,更加便于记忆和书写,但又同时保留了机器语言高速度和高效率的特点。汇编语言仍是面向机器的语言,很难从其代码上理解程序设计意图,设计出来的程序不易被移植,故不像其他大多数的高级计算机语言一样被广泛应用。所以在高级语言高度发展的今天,它通常被用在底层,通常是程序优化或硬件 *** 作的场合。

参考资料来源:百度百科-汇编语言

;启动入口

ORG 0000H ;复位启动

LJMP START ;

ORG 0100H ;

;

;主程序

START: MOV DPTR,#NUM ;数据区首地址

MOV B,#32 ;32字节求和

CLR A ;

MOV X,A ;清零和存储单元

MOV Y,A

MOV Z,A

LOOP: CLR A ;

MOVC A,@A+DPTR ;取当前字节数据

ADD A,X ;累加和

MOV X,A

MOV A,Y

ADDC A,#0

MOV Y,A

INC DPTR ;指向下一单元数据

DJNZ B,LOOP ;加完32字节

JMP $ ;死循环

;

ORG 0200H ;开辟数据区

NUM DB 32,2,5,4,9,220,234,7 ;

DB 11,22,51,42,93,220,234,17 ;

DB 31,32,35,43,39,220,234,37 ;

DB 91,82,45,74,89,220,234,97 ;

X EQU 70H ;和存储单元

Y EQU 71H ;

END ;

以上就是关于用汇编语言实现如下程序:进行自然数相加(1+2+3+……+N)。必须利用循环指令。全部的内容,包括:用汇编语言实现如下程序:进行自然数相加(1+2+3+……+N)。必须利用循环指令。、求一个汇编程序,在屏幕上依次显示1到100的累加,第一行显示1,第二行显示3,第三行显示6,第四行10、编写完整的汇编程序,从自然数1开始累加,直到累加和大于1000为止,并把累加结果保存在变量NUM中。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9280464.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存