Assembly 如何改进此汇编语言代码,使我可以包含10个数字?

Assembly 如何改进此汇编语言代码,使我可以包含10个数字?,assembly,branch,x86-16,Assembly,Branch,X86 16,我编写这段代码是为了从由3个元素组成的数组中查找最大元素。你们建议对代码做些什么修改,这样我就可以包含10个元素了 我尝试了许多修改,但无法找出如何为10个元素的数组获取最大元素 [ORG 0x100] jmp start num: dw 10,20,30 max: dw 0 start: mov ax,[num] mov bx,0 mov [max],ax add bx,2 mov ax,[num+bx] cmp ax,[max] jl next mov [max],ax

我编写这段代码是为了从由3个元素组成的数组中查找最大元素。你们建议对代码做些什么修改,这样我就可以包含10个元素了

我尝试了许多修改,但无法找出如何为10个元素的数组获取最大元素

[ORG 0x100]

jmp start
num: dw 10,20,30
max: dw 0

start: mov ax,[num]
   mov bx,0
   mov [max],ax

add bx,2
mov ax,[num+bx]
cmp ax,[max]
jl next
mov [max],ax


next: add bx,2
mov ax,[num+bx]
cmp ax,[max]
jl end
mov [max],ax

end: mov ax,0x4c00
int 0x21

同意,我的评论不太公开,但更多的信息是实际做这个练习,所以在这里,它肯定不复杂

    mov     si, Data
    xor     cx, cx
    mov     dx, Crunch

Crunch:
    lodsw
    test    ax, ax
    jz      Exit
    push    dx
    cmp     cx, ax
    ja      Exit
    mov     cx, ax
Exit:
    ret                  ;Either turns to another iteration or terminates

Data:   dw       4, 7, 21, 32, 208, 18, 44, 92, 244, 61, 108, 11, 0

这是动态的,所以它会一直处理数据直到零。从技术上讲,这是一个循环,但至少不是传统意义上的循环,因为在传统意义上,有一条特定的指令会强制代码上移。

您需要一个循环。如果不使用循环,我将如何实现它?我只需要跳转语句,而不需要循环。如果大于max,则需要重复检查,并将其设置为新的max块7次。循环只是一个比较和条件分支指令,就像您已经拥有的那样。只是有一个向后的分支,而不是只有向前的分支。@Jester谢谢你!!成功了!我早该明白的,我觉得自己太傻了!非常感谢,好先生。您只是使用了
push Crunch
/
ret
作为一种模糊的循环方式,而不是
jna Crunch
。这仍然是一个循环,而不是递归(因为你的深度永远不会超过1级),不管怎样,我都不会推荐给任何人,尤其是初学者。此外,很明显,这会返回CX中未签名的最大值?@PeterCordes问题中的什么让您相信值应该被签名?我从来没有暗示我在尝试递归,所以为什么要提出它,因为很明显它不是。指示状态机做你想让它做的事,不管是非常规的还是非常规的,都不是混淆。OP标准是
没有循环
jna Crunch
在本例中是一条循环指令。我最惊讶的是,您返回的是CX而不是普通AX,根本没有对代码进行注释。但是现在您提到了它,在第二次查看时,OP使用了
jl next
,签名比较。无论如何,如果OP不想循环,那么10次迭代就不需要完全展开。或者解释条件分支指令可以循环,这就是我认为它们应该做的。我认为“无循环”是OP方面的误解,而不是他们赋值的正式要求。此外,是的,我知道你没有使用递归,但这本质上仍然是一个循环(尽管你声称它不是)。如果你想在没有循环的情况下完成这项工作,并且不想完全展开,递归是计算机科学中处理任意大小问题的另一种主要技术。您正在避免向后条件分支,但OP从未具体说明他们可以/不能使用什么。再说一次,这很聪明,但对任何人来说都是一个糟糕的学习例子,除非你非常仔细地说明你为什么要这样做,并展示它的正常循环版本会很好。谢谢@Shift\u Left,我很感激你的回答,但正如彼得所说的,这超出了我的理解,因为我是一个绝对的初学者:)