+ -
当前位置:首页 → 问答吧 → 希望大家帮我改改

希望大家帮我改改

时间:2011-03-19

来源:互联网

原题是这样的
数组ARRAY是一个8个元素的有符号字数组,求该数组所有元素之和。可能超过16位,将其放入SUM,SUM+2中。

Assembly code
DATA SEGMENT
 ARRAY DW -111,222,-333,444,-555,666,777,888
 SUM DW ?
 STRING DB "The original array is: -111,222,-333,444,-555,666,777,888$"
 RESULT DB "Sum is $"
DATA ENDS
CODE SEGMENT
 ASSUME CS:CODE,DS:DATA
START:
 MOV AX,DATA
 MOV DS,AX
 LEA DX,STRING
 MOV AH,09H
 INT 21H
 LEA SI,ARRAY
 MOV CX,8
 MOV SUM,0
ONE:
 ADD SUM,SI
 ADD SI,2
LOOP ONE
 LEA DX,RESULT
 MOV AX,09H
 INT 21H
 MOV DX,SUM
 MOV AX,02H
 INT 21H
 MOV AH,4CH
 INT 21H
CODE ENDS
 END START

作者: hongjimmy91   发布时间: 2011-03-19

用add,adc指令

作者: Lactoferrin   发布时间: 2011-03-19

Assembly code

DATA SEGMENT
 ARRAY DW -111,222,-333,444,-555,666,777,888
 SUM DW 0,0   ;和可能超过16位, 所以SUM需要2个字单元
 STRING DB "The original array is: -111,222,-333,444,-555,666,777,888$"
 RESULT DB "Sum is $"
DATA ENDS
CODE SEGMENT
 ASSUME CS:CODE,DS:DATA
START:
 MOV AX,DATA
 MOV DS,AX
 LEA DX,STRING
 MOV AH,09H
 INT 21H
 LEA SI,ARRAY
 MOV CX,8
 ;MOV SUM,0      ;在定义时直接赋初值即可
ONE:
 ;ADD SUM,[SI]    ;这里加的是si指向的那个单元的内容,而非si
 MOV AX,[SI]     ;因为原来的数是有符号的,所以把它放ax
 CWD             ;然后带符号扩展到dx和ax组成的32位单元
 ADD SUM,AX      ;低16位加到SUM
 ADC SUM+2,DX    ;高16位连同低16位的进位加到SUM+2中
 ADD SI,2
LOOP ONE
 LEA DX,RESULT
 MOV AH,09H      ;这里是ah不是ax
 INT 21H
; MOV DX,SUM    ;这3条指令是显示ASCII字符的, 你的结果是当数字看到, 不能当字符输出
; MOV AX,02H
; INT 21H
  test sum+2,8000H   ;判断结果的符号(最高位为1是负数,为0是正数)
  jz positive        ;正数则直接处理
  mov ah,2           ;若是负数,就先输出负号
  mov dl,'-'
  int 21h

  mov ax,sum    ;将结果的低半部分送ax
  mov dx,sum+2  ;高半部分送dx

  not ax
  not dx
  add ax,1
  adc dx,0      ;32位数取反加1(就是变成它的相反数---绝对值)
  jmp trans     ;然后转输出
positive:
  mov ax,sum    ;将结果的低半部分送ax
  mov dx,sum+2  ;高半部分送dx.    这个地方的分支结构应该可以优化

trans:    ;把数字转成字符串然后输出
  mov cx,0     ;计数器记录转成十进制的数字位数
  mov bx,10    ;除以10的除数,用于转十进制
div10:
  div bx
  push dx     ;余数存入栈中
  inc cx      ;计数
  mov dx,0    ;被除数高位置0(这要加上和在高位上的数不超过9,否则算法更复杂)
  cmp ax,0    ;判断商是否为0
  jne div10   ;不为0继续除以10取余数

  mov ah,2
disp:         
  pop dx      ;取出依次保存的余数,即对应的十进制每位数
  add dl,30h  ;数字转成字符输出
  int 21h
  loop disp

 MOV AH,4CH
 INT 21H
CODE ENDS
 END START


作者: shzhfu   发布时间: 2011-03-19

调试结果:
Assembly code

The original array is: -111,222,-333,444,-555,666,777,888Sum is 1998

The original array is: -111,222,-333,444,-555,666,-777,-888Sum is -1332

作者: shzhfu   发布时间: 2011-03-19