2013-10-03 3 views
0

У меня есть буфер, который содержит: «B» «а» «с» «\ п» и я пытаюсь поменять буквы «б» и «в» ...x86 Сборка, синтаксис Своп

Проверил отладчик, напечатанная 4 байта EBP: 'B' 'а' 'с' '\ п' ....

  1. EBP - адрес буфера
  2. EAX - смещение (в настоящее время 0), так что Ebp + eax указывает на «b» в буфере
  3. Ebx - содержит 'b'
  4. Edi - содержит 'a'

Проблема заключается в том, когда я запускаю команду, которая должна перезаписать «B» в буфере с «а»:

mov [ebp + eax] , edi  

... Я печатаю буфер и теперь он содержит: 'a' 'c' '\ n' ... Куда делся «b»? Если я запускаю следующую команду, которая, как предполагается, перезаписать «а» в Буфф с «Ъ», завершая обмен:

mov [ebp + eax + 1], ebx 

... Я печатаю буфер и теперь он содержит: «а» ' b '' a '' c '... вместо' a '' b '' c '' \ n '... Может ли кто-нибудь объяснить, что здесь происходит?

+4

Вам нужно переместить только один байт, а не весь регистр (4 байта). –

ответ

1

Я думаю, что у вас скопировать весь 32 битный регистр перед тем

mov ebx, [ebp + eax]  ; ebx = 'bac\n', because you've just copy 4 bytes from ebp + eax to ebp + eax + 3 
mov edi, [ebp + eax + 1] ; edi = 'ac\n\garbage', which is ebp + eax + 1 to ebp + eax + 4 

Следовательно, после переезда она снова

mov [ebp + eax], edi  ; the string now becomes 'ac\n\garbage' 
mov [ebp + eax + 1], ebx ;      'abac' 

что и вы видите. Вы должны копировать только один байт, а не одно двойное слово. Но SI не имеет корреспондентский имя байт регистра, так что вы должны изменить регистрации использования в общий регистр байт, такие как CL, BL

Если вы используете x86_64, то просто скопировать и из SIL и BL

1

OP-х Ключевой проблемой является то, что EDI может быть перемещен только в память как 32-битное значение. Ему нужен регистр, который может быть перемещен как 8-битное значение, как предложил Луу; это будет AH, AL, BH, .... AL проще всего использовать, и это «часть» EAX.

Следуя совету Луу, было бы легко, если бы ОП пересмотрел его код, чтобы EDI содержал смещение, а EAX содержал символ. Тогда команда, необходимая для хранения байт

mov byte ptr [ebp+edi],al 

«байты PTR» говорит ассемблер вы ожидаете двигаться 8, а не 32 бита; это технически не нужно, потому что использование AL явно указывает, что нужно использовать только 8 бит, но это полезно для читателя.

Смежные вопросы