这是一个功课。我有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,6
或mov [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,但我没有看到它。
抱歉英语不好,不是我的第一语言。
答案 0 :(得分:0)
mov eax, myArray[TYPE myArray*ecx]
这里提到的地址是(myArray的基地址)+ sizeof(myArray的元素类型)* ecx。在汇编语言中,索引应该以字节为单位。