在程序集中反转数组的内容

时间:2011-03-09 20:43:06

标签: assembly x86

我正在做一些集会作业,我被困在我的最后一个节目上。如果任何拥有x86汇编知识的人潜伏着,请随时评论我如何开始使用它。谢谢!

问题

使用具有间接寻址或索引寻址的循环来反转整数数组的元素。不要将元素复制到任何其他数组。还可以使用SIZEOF,TYPE和LENGTHOF运算符使程序灵活地适应不同的数组。

到目前为止

代码:

.data
array BYTE 10h,20h, 30h, 40h

.code
main PROC
    call Clrscr

        ;no clue... 

    exit
main ENDP

END main

4 个答案:

答案 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));