我在汇编语言中遇到问题,我想为数组的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(&)打印出来的显示有问题。
答案 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=0
和AL=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]