我正在做一些集会作业,我被困在我的最后一个节目上。如果任何拥有x86汇编知识的人潜伏着,请随时评论我如何开始使用它。谢谢!
问题:
使用具有间接寻址或索引寻址的循环来反转整数数组的元素。不要将元素复制到任何其他数组。还可以使用SIZEOF,TYPE和LENGTHOF运算符使程序灵活地适应不同的数组。
到目前为止代码:
.data
array BYTE 10h,20h, 30h, 40h
.code
main PROC
call Clrscr
;no clue...
exit
main ENDP
END main
答案 0 :(得分:2)
好吧,用esi指向数组的开头,用edi指向结尾,加载两个..元素(?),交换它们然后相应地更改esi和edi并重复直到....提示:你不要必须交换任何东西,因为你在汇编= P
答案 1 :(得分:2)
我在装配方面不是很好,所以可能存在一个更好的答案(这个有效)。
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
答案 2 :(得分:0)
专家会使用特殊的字符串指令以及源寄存器和目标寄存器;但这可能看起来像是在欺骗你的作业。
以下是您可以用来实现目标的基本方法:
MOV目标来源
MOV eax,数组将数组地址加载到eax
MOV edx,[eax]将eax指向的值加载到edx中
INC eax将eax中的值增加一个
OR eax,eax(如果eax为零,则设置零标志)
JZ标签(如果设置了零标志,则跳转到标签)
通过添加冒号“:”来设置标签,例如label:
答案 3 :(得分:-1)
cout << (false||(!false));