我目前正在编写一个程序集,该程序将反转"字符串的顺序。
我的字符串存储在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]
答案 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%!