[英]Reverse contents of array in assembly
我正在做一些组装作业,并为上一个程序感到困惑。 如果有x86汇编知识的人潜伏,请随时评论我可能是如何开始的。 谢谢!
问题 :
使用具有间接寻址或索引寻址的循环将原位整数数组的元素反转。 不要将元素复制到任何其他数组。 还可以使用SIZEOF,TYPE和LENGTHOF运算符来使程序灵活地适应不同的数组。
到目前为止的代码:
.data
array BYTE 10h,20h, 30h, 40h
.code
main PROC
call Clrscr
;no clue...
exit
main ENDP
END main
我的汇编能力不是很好,因此可能会有更好的答案(此方法可行)。
TITLE Reversing an array without using oneother array
INCLUDE Irvine32.inc
.data
array1 DWORD 10d,20d,30d,40d,50d,60d,70d,80d,90d
.code
main PROC
mov ESI, OFFSET array1 ;ESI now points to the first item of array1
mov EDI, SIZEOF array1
add EDI, OFFSET array1
sub EDI, TYPE array1 ;EDI now points to the last item of array1
mov ECX, LENGTHOF array1
shr ECX, 1 ;now ecx is half the length of the array1
L1: mov EAX, [ESI] ;in this loop we reverse the items of the array
mov EBX, [EDI]
mov [EDI],EAX
mov [ESI],EBX
add ESI, TYPE array1
sub EDI, TYPE array1
LOOP L1
mov ECX, LENGTHOF array1;here we just print the array
mov ESI, OFFSET array1
L2: MOV EAX, [ESI]
call WriteInt
call Crlf
add ESI, TYPE array1
LOOP L2
exit
main ENDP
END main
好吧,将数组的开头指向esi,将结尾指向edi,加载两个..元素(?),交换它们,然后相应地更改esi和edi并重复直到....提示:您不必交换任何事情,因为您正在组装中= P
专业人士会使用特殊的字符串指令以及源和目标寄存器; 但这看起来像是您骗了作业。
以下是可用于实现目标的基本备忘录:
MOV目标来源
MOV eax,数组将数组的地址加载到eax中
MOV edx,[eax]将eax指向的值加载到edx中
INC eax将eax的值增加一
或eax,eax(如果eax为零,则设置零标记)
JZ标签(如果设置了零标记,则跳转到标签)
通过添加冒号“:”来设置label:
INCLUDE Irvine32.inc
.data
arr1 word 1,3,4,6,7,8,9
.code
main PROC
mov esi,offset arr1
mov ax,offset arr1
mov ecx,lengthof arr1-1
l1:
mov ax,type arr1
loop l1
mov ecx,lengthof arr1
l2:
mov eax,[esi]
mov ebx,[ax]
xchg eax,ebx
mov esi,eax
mov ebx,ax
add esi,type arr1
sub ax,type arr1
dec ecx
loop l2
call dumpRegs
exit
main ENDP
END main
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.