使用8086汇编语言计算1到100的和,调试DS:0000-DS:0001时显示DC 20而不是BA13

问题描述 投票:0回答:1

代码:

DATA SEGMENT
   SUM DW 0          
DATA ENDS

CODE SEGMENT
   ASSUME DS:DATA, CS:CODE

START:
   MOV AX, DATA     
   MOV DS, AX       
   MOV CX, 100      
   MOV AX, 0        
   MOV BX, 1        
 
SUM_LOOP:
   ADD AX, BX       
   INC BX           
   LOOP SUM_LOOP    

   MOV SUM, AX      
   MOV AX, 4C00H    
   INT 21H

CODE ENDS
END START

为什么会出现这样的错误?如何改变

assembly
1个回答
0
投票

将数字 1 到 100 相加得出 50 * (1 + 100),即 5050 (13BAh)。所以你可以

mov ax, 50 * (1 + 100)
...
但可能您需要编写一个循环。
然后观察 1 + 2 + 3 + ... + 100 之和等于 100 + ... + 3 + 2 + 1 之和。这意味着您的循环不需要递增额外变量 BX。您可以简单地添加递减循环控制变量CX:

  mov  cx, 100
  xor  ax, ax
SUM_LOOP:
  add  ax, cx
  loop SUM_LOOP

总有一天您需要打印程序的结果,那么为什么不从今天开始呢?

  ; Code to display AX in decimal
  mov  di, 10      ; CONST divider
  push di          ; Sentinel
.a:
  xor  dx, dx
  div  di          ; DX:AX / DI
  push dx          ; Push remainder [0,9]
  test ax, ax
  jnz  .a
  pop  dx
.b:
  add  dl "0"      ; From [0,9] to ["0","9"]
  mov  ah, 02h     ; DOS.PrintCharacter
  int  21h
  pop  dx
  cmp  dx, di
  jb   .b          ; Continu until we popped the sentinel
© www.soinside.com 2019 - 2024. All rights reserved.