装配数组和循环

时间:2015-07-02 07:53:30

标签: arrays loops assembly

我在汇编语言中遇到问题,我想为数组的sum元素进行循环。
假设一个数组包含10,20,30,40,50,60,70,80,90,100 I必须通过循环对数组的所有元素求和...我该怎么做?


我正在尝试这个:

.MODEL SMALL
.STACK 100H
.DATA
W   DW 10,20,30,40,50,60,70,80,90,100
.CODE 
MAIN PROC
MOV AX, @data
MOV DS, AX

XOR AX, AX
XOR BX, BX
MOV CX, 10

ADDNOS:
ADD AX, W [BX]
ADD BX, 2
LOOP ADDNOS


;this for display
MOV DX, AX
MOV AH,2
INT 21H

MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN 


但是从ascii(&)打印出来的显示有问题。

2 个答案:

答案 0 :(得分:0)

编辑:由于问题中的代码已更改,因此更新了答案:

INT 21h / AH=2打印单个字符(请注意,整数1和字符'1'是不同的值)。
数组中元素的总和为550,需要打印3个字符。解决这个问题的方法是编写一个例程,将值550转换为字符串" 550",然后使用INT 21h / AH=9打印该字符串。在StackOverflow之前,你曾经多次询问过你是怎么做的;见例如this question及其答案。

这是我对原始问题的回答

对于将来的问题,请注意"但是错误" 是一个可怕的问题描述。您应该准确地解释代码以何种方式表现出您的预期行为。

也就是说,您的代码存在许多问题:

在此您将CX初始化为x中的第一个值。实际上,由于x中的元素是字节(因为您使用了DB)而CX是一个字(两个字节),您将获得CX = 301h(这是769(十进制):

MOV CX, x

您只需将x的第一个元素一遍又一遍地移动到BX,而不是进行添加。同样,x包含字节,而BX是字寄存器。

top:    MOV BX, [x]

loop指令将CX递减1并跳转到给定标签CX != 0。通过在CX之前递增loop,您需要创建无限循环。此外,CMP没用(我不确定为什么你要比较7,因为x只有5个元素):

INC CX
CMP CX, 7
loop top

这仅适用于0-9范围内的值。如果总和> = 10,则需要多个字符。参见例如this answer示例了解如何将多位数转换为可打印的字符串。此外,您还要将字大小的寄存器写入字节变量:

ADD BX, '0'
MOV [sum], BX

在这里,我有点迷失在你想要做的事情上。如果您想将单个字符写入STDOUT,则应使用INT 21h / AH = 2 / DL = character。请注意MOV AX,4设置AH=0AL=4。此外,您应该使用INT 21h / AX = 4C00h

结束您的计划
display_:
    MOV DX,1
    MOV CX, sum
    MOV BX, 1
    MOV AX,4
    INT 21h
    MOV AX, 1
    INT 21h

答案 1 :(得分:-1)

我怀疑top标签后的代码中存在错误。

你做MOV BX, [x]但我认为你应该将CX指向的项目与BX中的当前内容(似乎存储总和)相加。因此,将move指令替换为:

ADD BX, [CX]