Я спрашиваю, что является лучшим способом переноса символов в строке справа или слева в сборке x86 с использованием библиотеки Irvine. есть пример: 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' является последним * индексом *, а не * длиной *), у вас есть один за другим как при первой загрузке, так и в цикле. –
Если 'innr1' будет делать что-то вроде' str [esi + 1] = str [esi] ', он либо перезапишет целую строку, либо, по крайней мере, второй символ, поскольку' mov [esi + 1], bl' перезаписывает char, который еще не был прочитан => потерян навсегда. Кстати, какой отладчик вы используете? Вы действительно писали столько кода, даже не пытаясь, если сначала «mov al, [esi + ...]' загружает последний символ? Должно быть сложно скомпоновать в сборке, уважительное отношение, похоже на мазохизм. Но вы также не показываете определение 'arr'. ИМО не понимает, как работает программирование в сборке. Сначала данные, вторичные. – Ped7g