比较汇编中数组中的两个索引

时间:2016-02-14 23:37:17

标签: arrays assembly x86

我目前正在编写一个程序集,该程序将反转"字符串的顺序。

我的字符串存储在ebx寄存器中 当前计数存储在ecx寄存器中 字符串长度存储在eax寄存器中。 我对如何在“计数”中访问该元素感到困惑。 ebx中的位置和数组中的另一个元素。 在伪代码中

int count = 0;
int rcount = myString.length() - 1;
while(count < rcount)
    myString[count] ^= myString[rcount];
    myString[rcount] ^= myString[count];
    myString[count] ^= myString[rcount];
    count++;
    rcount--;

^ =运算符是xor语句。 所以在汇编时它会是这样的(编码不正确我不知道如何在汇编中访问数组)

 xor ebx[count], ebx[rcount]

2 个答案:

答案 0 :(得分:4)

在这种情况下,XOR交换不是很有用。只需将2个项目加载到2个寄存器中,然后将它们写出来进行交换。例如:

mov al, [ebx + ecx] ; assume ecx = count
mov ah, [ebx + edx] ; assume edx = rcount
mov [ebx + ecx], ah ; write out
mov [ebx + edx], al ; swapped

答案 1 :(得分:2)

交换可以用3条指令编写。

  

我的字符串存储在 ebx 寄存器中。   当前计数存储在 ecx 寄存器中,字符串长度存储在 eax 寄存器中。

此代码将反转字符串:

     test eax, eax
     jz   ready
     xor  ecx,ecx
     jmp  next
swap:
     mov  dl, [ebx+ecx]   \
     xchg dl, [ebx+eax]   | The swap
     mov  [ebx+ecx], dl   /
     inc  ecx
next:
     dec  eax
     cmp  ecx, eax
     jb   swap
ready:

更好的版本(更长但更快)将避免使用慢速内存 - xchg指令,并且将通过{{1}一次处理8个字符指令。 Peter Cordes建议的酷戏法

我使用了与之前相同的寄存器布局:

bswap

我在字母表字符串上测试了两个版本(字符串中有26个字节),我的速度提高了 64%