内联asm和c数组问题

时间:2014-05-10 01:40:21

标签: c++ arrays visual-c++ assembly inline-assembly

这是一个功课。我有3个数组,v1 = {5,4,3,2,1},v2 = {1,2,3,4,5}和v3 = {2,3,5,1,4},分配是将1更改为6.当然,任何解决方案如v1 [4] = 6,在asm或c中都是被禁止的。所以这是我的代码:

第一个代码

void main(){
int myArray[5]={5,4,3,2,1};

__asm {
    mov ecx,0 //using ecx as counter
myLoop: 
    mov eax, myArray[ecx] //moving the content on myArray in position ecx to eax
    cmp eax,1            //comparing eax to 1
    je is_one            //if its equal jump to label is_one
    inc ecx              //ecx+1
    cmp ecx,5     //since all vectors have size 5, comparing if ecx is equal to 5
    jne myLoop          //if not, repeat
    jmp Done            //if true, go to label Done
is_one: 
    mov myArray[ecx],6 //changing the content in myArray position ecx to 6
    inc ecx            //ecx+1
    cmp ecx,5          // ecx=5?
    jne myLoop         //no? repeat loop
    jmp Done           //yes? Done
Done:
    }
printArray(myArray);
}

这没有用,尝试了许多内容,例如mov eax,6mov [eax+ecx],6,在我找到 this solution

之前没有任何效果

许多人稍后尝试代码

void main(){
int myArray[5]={5,4,3,2,1};

__asm {
    mov ecx,0 //using ecx as counter
myLoop: 
    mov eax, myArray[TYPE myArray*ecx] //I don't understand how this works
    cmp eax,1            //comparing eax to 1
    je is_one            //if its equal jump to label is_one
    inc ecx              //ecx+1
    cmp ecx,5     //since all vectors have size 5, comparing if ecx is equal to 5
    jne myLoop          //if not, repeat
    jmp Done            //if true, go to label Done
is_one: 
    mov myArray[TYPE myArray*ecx],6 //Uhh...
    inc ecx            //ecx+1
    cmp ecx,5          // ecx=5?
    jne myLoop         //no? repeat loop
    jmp Done           //yes? Done
Done:
    }
printArray(myArray);
}

这就像一个魅力。但我不明白MOV array[TYPE array * index], value如何或为何有效(除了TYPE返回链接中解释的大小),为什么不是其他人。

此外,由于我必须为3个数组执行此操作,因此我尝试将所有代码复制并粘贴到changingArray(int myArray[]),在main中声明3个数组,并将它们传递给changingArray,但现在不会更改他们。我很确定使用矢量你不必通过&,我可能是错的。不过,我无法理解它为什么不改变它们。所以......

最终代码

void changingArray(int myArray[]){
__asm {
    mov ecx,0 //using ecx as counter
myLoop: 
    mov eax, myArray[TYPE myArray*ecx] //I don't understand how this works
    cmp eax,1            //comparing eax to 1
    je is_one            //if its equal jump to label is_one
    inc ecx              //ecx+1
    cmp ecx,5     //since all vectors have size 5, comparing if ecx is equal to 5
    jne myLoop          //if not, repeat
    jmp Done            //if true, go to label Done
is_one: 
    mov myArray[TYPE myArray*ecx],6 //Uhh...
    inc ecx            //ecx+1
    cmp ecx,5          // ecx=5?
    jne myLoop         //no? repeat loop
    jmp Done           //yes? Done
Done:
    }
printArray(myArray);
}

void main(){
   //for some odd reason, they arent changing
   int v1[5]={5,4,3,2,1}; 
   int v2[5]={1,2,3,4,5};  
   int v3[5]={2,3,5,1,4};
   changingArray(v1);
   changingArray(v2);
   changingArray(v3);
}

TL:DR部分

在3个阵列中改变数字1到6的作业v1 = {5,4,3,2,1},v2 = {1,2,3,4,5}和v3 = {2,3,5 ,1,4}

1 - 我不知道为什么第一个代码不起作用,但很多人尝试以后代码可以工作(MOV array[TYPE array * index], value指令)。

2-由于我需要对3个数组执行此操作,因此我将所有代码放在changingArray(int myArray[])中,并且在main中我在main中声明了我的3个数组,如最终代码所示。虽然许多尝试代码确实改变了数组,但这并不存在。可能我在c中犯了一个错误,而不是asm,但我没有看到它。

抱歉英语不好,不是我的第一语言。

1 个答案:

答案 0 :(得分:0)

mov eax, myArray[TYPE myArray*ecx]

这里提到的地址是(myArray的基地址)+ sizeof(myArray的元素类型)* ecx。在汇编语言中,索引应该以字节为单位。