通过x86中的向量迭代?

时间:2016-12-04 17:14:46

标签: assembly x86

所以,我们开始在x86中做一些小事,但我根本无法掌握它。我们有这个:

  .Data
  frequency DW 0, 260, 300, 330, 350, 390, 440, 500, 520, 590, 660, 700

我必须遍历它,对我来说似乎很简单,但是:

  mov EAX, frequency  
  mov ECX, 0  // as a counter

不正确,我是对的吗?我正考虑转移EAX频率的地址,但后来对我来说似乎并不合适。
任何人都可以帮助我知道如何进行简单的[if != 700]循环? 不要真的关心循环,只想知道如何获得元素"频率"进入一个寄存器,然后继续下一个。

2 个答案:

答案 0 :(得分:0)

你正好在第一个。

mov EAX, frequency获取第一个元素的地址 mov dx, [eax]从数组中获取一个元素 add eax, 2移动到下一个元素。

答案 1 :(得分:0)

您必须假设这些值连续存储在内存中。然后你获得一个指向第一个(地址)的指针,并通过连续递增每个元素大小的指针来迭代它们。

要知道何时停止迭代(,对于循环终止条件),您可以使用计数器(因为您知道有一个常量的12个元素),或者您可以检查值得看它是否为700(那么你知道你最后)。

以下是使用计数器的示例:

    mov  ecx, 0                  ; initialize counter
    mov  edx, OFFSET frequency   ; get address of the first element
DoLoop:
    mov  eax, DWORD PTR [edx]    ; get value of the element
    ...                          ; do something with that value, now in the EAX register
    inc  ecx                     ; increment counter by one
    add  edx, 2                  ; increment pointer by size of an element
    cmp  ecx, 12                 ; compare counter against 12 (total number of elements)
    jl   DoLoop                  ; keep looping while less than 12

有多种方法可以编写这个循环,有些方法可能比上面的代码稍微优化一些,但这应该会给你一个想法。

如果你只是想做一个简单的"如果x!= 700"循环,然后它就像:

cmp  X, 700       ; where X is some register or memory location that you want to test
jne  BranchLabel  ; where 'BranchLabel' is the label to jump to if X != 700

通常,在x86上,您将使用CMP instruction设置条件分支,然后执行a Jcc instruction实际进行分支(其中cc是条件代码指定如何测试标志。)

但是,您不必使用CMP指令。还有许多其他指令设置标志,包括TEST和几乎所有的算术和按位指令(例如ADDSUB,{{ 1}}等等)如果已经设置了标志,那么你可以直接进行XOR。没有必要进行冗余比较!