【问题标题】:Assembly Array and loop组装数组和循环
【发布时间】:2015-07-02 07:53:29
【问题描述】:

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


我正在尝试这个:

.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 (&) 打印的显示有问题。

【问题讨论】:

  • 我可以建议您从头开始重试吗?我看不到一条值得保留的线。任何有用的答案只能是你功课的完整解决方案

标签: arrays loops assembly


【解决方案1】:

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

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 则跳转到给定标签。通过在loop 之前增加CX,您正在创建一个无限循环。此外,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

【讨论】:

  • 在代码中看到MOV [sum], BX 我怀疑MOV CX, x 而是意味着将x的地址放入CX。
  • 这可能是 OP 的意图。但这并不是它在 OP 代码中使用的 x86 汇编方言中的实际含义。
  • 如何转换(值到字符串!)?我这样做了,AP_: MOV DX,0 DIV BX ADD DX, 48 DEC SI MOV [SI], DL CMP AX,0 JZ EXTT JMP AP_ EXTT: MOV AH,9 MOV DX,SI INT 21H RET 但程序不起作用
【解决方案2】:

我怀疑top 标签后面的代码有错误。

您可以使用MOV BX, [x],但我认为您应该将CX 指向的项目与BX 中的当前项目相加(这似乎存储了总和)。因此,将移动指令替换为:

ADD BX, [CX]

【讨论】:

  • [CX] 不是有效的有效地址。并且CX 没有指向x(这将需要MASM/TASM 语法中的OFFSET 运算符,这段代码似乎是用它编写的)。
猜你喜欢
  • 2020-10-28
  • 2021-02-13
  • 2022-11-29
  • 1970-01-01
  • 2023-03-05
  • 2012-07-09
  • 2015-09-03
  • 2018-04-21
相关资源
最近更新 更多