2012-10-15 117 views
0

我的任务是使用嵌入到C中的程序集在数组中找到最小的字母。我不知道如何访问数组中的每个元素。我试着用搜索引擎,我发现,有些人在做以下几点:将一个数组元素移动到一个寄存器组件

MOV ECX,arrayOfLetters

,然后递增ECX访问每个元素。这是正确的还是我写的是正确的?

请帮忙,我很困惑。

char findMinLetter(char arrayOfLetters[], int arraySize) 
{ 
    char min; 

    __asm{ 
     push eax 
     push ebx 
     push ecx 
     push edx 
     mov dl, 0x7f  // initialize DL 


     xor ebx, ebx //EBX started off as 0 

     //moves letters from array to registers 
     mov ecx, arrayOfLetters[ebx] 
     mov edx, arrayOfLetters[ebx+1] 

回答

0

要理解的第一件事是传递给你的子程序的'arrayOfLetters'是一个指针。

访问数据(每次一个字节)的指针(在ECX)在汇编中,使用:

mov al, [ecx] 
mov al, [ecx+1] 
... or ... 

mov al, [ecx] 
inc ecx 
mov al, [ecx] 

下一个问题是局部变量是如何访问:有使用的两种主要方式和两他们使用堆栈

mov ecx, _localvariable_ ; this translates to either 

mov ecx, [ebp + offset] ; style (1) or 
mov ecx, [esp + offset] ; style (2) 

如果有一个汇编程序支持指令MOV ECX,_localvariable [+1],将最有可能转换为:

mov ecx, [ebp + offset + 1] 

,这将不能访问char数组[],只是堆栈中的一些任意字节。

+0

另外mov ecx,_localvar_ + offset + [ebx]将是完全合法的组合(取决于汇编程序)。这将转换为mov ecx,[offset_X + ebp + ebx];这是一个有效的寻址模式,但不会做有意的事情 –

相关问题