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

Assembly 在程序集中反转数组的内容,assembly,x86,Assembly,X86,我正在做一些组装作业,上一个程序我被难倒了。如果有人有x86汇编知识,请随时评论我如何开始使用它。谢谢 问题: 使用具有间接寻址或索引寻址的循环来反转整数数组中的元素。不要将元素复制到任何其他数组。还可以使用SIZEOF、TYPE和LENGTHOF运算符使程序灵活地适应不同的阵列 迄今为止的代码: .data array BYTE 10h,20h, 30h, 40h .code main PROC call Clrscr ;no clue... exit

我正在做一些组装作业,上一个程序我被难倒了。如果有人有x86汇编知识,请随时评论我如何开始使用它。谢谢

问题

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

迄今为止的代码:

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

.code
main PROC
    call Clrscr

        ;no clue... 

    exit
main ENDP

END main

好的,用esi指向数组的开头,用edi指向数组的结尾,加载这两个。。元素(?),交换它们,然后相应地更改esi和edi,并重复,直到。。。。提示:您不必交换任何内容,因为您在assembly=P

中,pro将使用特殊的字符串指令以及源寄存器和目标寄存器;但那可能看起来像是你作弊了

以下是可用于实现目标的基本备忘录:

  • 目的地源

    MOV eax,array将数组的地址加载到eax中

    MOV edx,[eax]将eax指向的值加载到edx中

  • INC eax将eax中的值增加1

  • 或eax,eax(如果eax为零,则设置零标志)

  • JZ标签(如果设置了零标志,则跳到标签)


标签是通过添加冒号来设置的:“像
标签:

我在汇编方面不是很好,所以可能存在一个更好的答案(这个答案有效)


也许你可以先考虑一下如何用一种你更熟悉的语言来做。用C写答案,然后编译成汇编程序,让它看起来像你自己键入的一样Dyou可以使用堆栈将元素推入其中并弹出它们。例如:
arr db 3,2,1
push 3
push 2
push 1
在堆栈上,然后将它们弹出,并从一开始将它们放置在适当的索引处。您可以使用堆栈来推送其中的元素并弹出它们。例如:
arr db 3,2,1
push 3
push 2
push 1
在堆栈上,然后弹出它们并将它们放置在适当的索引处。根据特殊的字符串说明,您指的是MOV*?我听说它们已经过时了,因为它们可能会对现代管道造成严重破坏,但仍能提供优雅而简单的解决方案。更不用说MOV了。谈论使用R/ESX和R/EDX的微码。此外:这根本不是问题或我的答案的内容。@eznme,dunno谁投了你的票。请投我一票来抵消它。谢谢你的回答!pro将使用4字节加载和
bswap
反转寄存器中的4字节。对于一个加载和指针增量,您可能会考虑<代码> RoSDS,但仅在HasWess和NeWER上,只有2个UOPS。(与
mov-eax[esi]
/
添加esi,4相同)。也。但这毫无意义,因为在你建议的代码中,它是一个指针,而不是一个索引。请投我一票来抵消它。谢谢你的回答!是的,除非你不需要。只要
cmp-esi、edi
/
jb-L1
循环,而开始指针低于结束指针。指针设置也可以更简单:要么在数组末尾放置一个标签,要么
mov edi,OFFSET array1+SIZEOF array1-TYPE array1
,以在汇编类型上进行所有计算。虽然这段代码可能解决了这个问题,但这如何以及为什么解决这个问题会真正有助于提高文章的质量,而且可能会得到更多的支持票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请您在回答中添加解释,并说明适用的限制和假设。
mov ebx,[ax]
无法组装;16位寻址模式不能将
AX
用作基或索引。这是32位代码,所以如果使用了有效的寄存器,但仍然将32位标签地址截断为16位,则几乎肯定会出错。另外,这两个循环中都没有任何存储指令,只有无用的
xchg
和reg移动。和一个超级奇怪的
dec ecx
/
循环
,而不是首先使用
length/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
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