【发布时间】:2016-12-24 06:17:42
【问题描述】:
我在问使用 Irvine 库在 x86 程序集中将字符串中的字符向右或向左移动的最佳方法是什么。 有一个例子: ABCD --> DABC 等等
我已经编写了这段代码,但它给出了错误的结果。
r1:
push ecx
mov ecx,lengthof arr
mov al,[esi+lengthof arr]
mov bl,[esi]
mov [esi],al
mov [esi+1],bl
inc esi
innr1:
mov al,[esi]
mov bl,[esi+1]
mov [esi],al
inc esi
loop innr1
pop ecx
loop r1
【问题讨论】:
-
循环
innr1:什么都不做,只是加载al并将其存储在它的来源处,而bl被忽略。 -
另外(除非
lengthof arr是最后一个 index 而不是 length),您在第一次加载时都分别,并在循环计数器中。 -
如果
innr1会执行类似str[esi+1] = str[esi]的操作,它会覆盖整个字符串,或者至少覆盖第二个字符,因为mov [esi+1],bl会覆盖尚未读取的字符=> 永远丢失.顺便说一句,您使用什么调试器?如果第一个mov al,[esi+...]加载最后一个字符,你真的写了这么多代码吗?必须很难在汇编中这样编码,尊重,看起来有点像受虐狂。但是您也没有显示arr的定义。 IMO 误解了 Assembly 编程的工作原理。数据第一,代码第二。