所以,我们开始在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
]循环?
不要真的关心循环,只想知道如何获得元素"频率"进入一个寄存器,然后继续下一个。
答案 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
和几乎所有的算术和按位指令(例如,ADD
,SUB
,{{ 1}}等等)如果已经设置了标志,那么你可以直接进行XOR
。没有必要进行冗余比较!