Изменение всех значений в строке на «m» - PullRequest
0 голосов
/ 22 января 2011

Я только начинаю играть с маской. Я не понимаю, почему этот код не работает.

.data 
MsgBoxCaption  db "Iczelion Tutorial No.2",0 
MsgBoxText       db "Win32 Assembly is Great!",0
savedAddr DWORD ?

.code 
start: 
mov eax, 10
mov savedAddr, OFFSET MsgBoxText

lab:
inc MsgBoxText
MOV MsgBoxText, 'm'
cmp eax, 0
dec eax
jnz lab

invoke MessageBox, NULL, savedAddr, addr MsgBoxCaption, MB_OK  
invoke ExitProcess, NULL
end start

Редактировать: Я ожидаю, что первые 10 символов в MsgBoxText будут "М". Вместо этого только первая буква - это «м». Я предполагаю, что inc MsgBoxText увеличивает указатель.

1 Ответ

1 голос
/ 22 января 2011

На первый взгляд кажется, что этот код ничего не должен делать, кроме как изменить W из Win32 на 'a' , а затем на один'm'.

Вы увеличиваете слово в памяти на MsgBoxText, то же самое слово, в каждой итерации цикла.

Чтобы заглушить строку, используя 'm' символов, лучшей стратегией было бы загрузить адрес строки в регистр, начать хранить байты 'm', а затем увеличить значение в регистре, а также уменьшить счетчик.

Обновление: Хорошо, чтобы ответить на вопрос в комментарии, измените цикл на:

  lea esi, MsgBoxText
  mov bl, 'm'
lab:
  mov [esi], bl
  inc esi
  cmp eax, 0
  dec eax
  jnz lab
...