【问题标题】:Manipulating arrays in assembly在汇编中操作数组
【发布时间】:2012-11-12 13:29:31
【问题描述】:

我有一个问题,我想不通:

在汇编语言中,编写一个函数,该函数接收指向整数数组的指针和该数组的大小,并通过反转其元素来更改数组,而无需将数组复制到堆栈。使用专用指令和寄存器处理数组(esiedilodsbstosbcldstd)。

示例:1 2 3 4 5 -> 5 4 3 2 1

大家有什么建议吗?

【问题讨论】:

  • 我什至不知道从哪里开始......
  • 首先了解指令 lodsb、stosb、cld 和 std 的作用。然后弄清楚它们如何适合这项任务以及需要哪些其他说明。
  • lodsbstosb 不太适合整数数组。 lodsdstosd 可能会工作。卡特博士的 tut 可以举一个例子 - drpaulcarter.com/pcasm
  • @FrankKotler 对于整数 lodsbstosblodsdstosd 一样合适,取决于使用的整数的大小,OP 没有提及。 8位整数足够大,例如。用于 24 位真彩色图像的常规 8 位位平面。

标签: arrays assembly x86 nasm reverse


【解决方案1】:

使用lodsbstosb 反转数组需要cldstd 用于每个元素(因为其中一个指针需要递增,而另一个需要递减),或者,您可以忘记@ 987654325@ 和 std 并通过在每个元素后减去 2(或加 2)来取消另一个指针的不正确增量(或减量)。

无论如何,在我看来,在这种情况下使用 lodsbstosb 会使事情变得不必要地复杂。我会使用这样的东西:

    mov esi,start_address
    mov edi,end_address

    mov ecx,edi
    sub ecx,esi

x1: test ecx,ecx
    jz @ready

    mov al,[esi]
    xchg al,[edi]
    mov [esi],al
    inc esi
    dec edi
    dec ecx
    jmp x1

@ready:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多