Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > передать адрес


Автор: I_Am_Rock 22.9.2009, 15:45
Привет. Я новичок. 

Такой вопрос
В этом куске кода (MASM если что) адрес значения Text1 ("Putin") передается в eax. Увеличиваем его на единицу.

Код

mov        eax, offset Text1
inc          eax


Хочу передать адрес в Text1 (чтобы стало "utin").
Пробую так...

Код

mov        offset Text1, eax


...не получается.

Как надо сделать? Гуглил, но ничего не нашел.(((

Автор: Goodwin98 22.9.2009, 16:01
Код

mov eax,[eax]
mov [text1],eax
mov [tex1+4],0

Автор: I_Am_Rock 22.9.2009, 16:05
Это MASM? У меня не работает, пишет - invalid instruction operands
 smile

Добавлено @ 16:18
Цитата(Goodwin98 @ 22.9.2009,  16:01)
Код

mov eax,[eax]
mov [text1],eax
mov [tex1+4],0

В 1 строчке - зачем мне помещать в eax что-то? Там что нужно уже стоит. Именно то, что там стоит нужно сделать адресом Text1
Ругается на вторую строчку.
Я попробовал использовать только 3-ю, пишет - "Puti", а мне нужно чтобы не было первого символа - "utin".
Но вообще смысл в том, что я хочу понять как произвести обратную операцию от mov    eax, offset Text1

Автор: Goodwin98 22.9.2009, 18:32
Код

mov eax, offset text1
inc eax
mov eax,[eax]
mov dword ptr [text1],eax
mov [text1+4],0

Во-первых следует помнить, что text1 - это метка, которой соответствует какой-то аддрес( процедуры, строки, переменной и т.п). Когда компилятор встречает offset text1, он подставляет вместо него аддрес строки. Естественно, что при выполнении программы уже никаких меток нету.
Поэтому в вашем случае можно либо перенести строчку( что я и сделал), либо использовать указатель на нее.
Код


mov eax, [ptext]
inc eax
mov [ptext],eax

invoke MessageBox,0,ptext,0,MB_OK

ptext dd offset text1
text1 db "Medved",0

Автор: I_Am_Rock 22.9.2009, 20:24
Ничего не получается! (((

Вообще я пробую на другом примере, а с Putin привел для наглядности.

Я пробую вот на каком примере. Там есть кнопка. При нажатии на нее берется строка из ТекстБокса, потом делается то, что я как раз хочу сделать ("убрать" первый символ), потом все буквы строки делаются большими и выводятся в Лейбл.

Всё получается, только вот никак не убирается первый символ. ((( Причем я хочу сделать именно так - поместив адрес в регистр и т.д. Я хочу понять сам принцип.

См. код примера в файле. Он небольшой, и место для изменений я выделил комментариями с восклицательными знаками.
Код

; !!!!!!!!!!!!!!!!!!!!!!!!!!


Помогите, пожалуйста. Уже мозг кипит.  smile 

Автор: Goodwin98 22.9.2009, 21:22
Эх. Вы не можете  изменить по ходу программы аддрес text1. Он постоянный.
Для вашей программы проще всего сделать так.
Код

Knopka proc hWnd:HWND
invoke      GetWindowText, hwndEdit1, addr TextEdit1, 30
; !!!!!!!!!!!!!!!!!!!!!!!!!!
mov                 eax, offset TextEdit1
inc                 eax
; !!!!!!!!!!!!!!!!!!!!!!!!!!
invoke      CharUpper, addr TextEdit1+1
invoke      SetWindowText, hwndLabel1, addr TextEdit1+1
ret
Knopka endp

Но т.к. вам нужн через eax, то тогда так.
Код

Knopka proc hWnd:HWND
invoke      GetWindowText, hwndEdit1, addr TextEdit1, 30
; !!!!!!!!!!!!!!!!!!!!!!!!!!
mov                 eax, offset TextEdit1
inc                 eax
; !!!!!!!!!!!!!!!!!!!!!!!!!!
invoke      CharUpper, eax
invoke      SetWindowText, hwndLabel1, eax
ret
Knopka endp

Или так.
Код

.data
pText dd offset TextEdit1
.........
Knopka proc hWnd:HWND
invoke      GetWindowText, hwndEdit1, pText, 30
; !!!!!!!!!!!!!!!!!!!!!!!!!!
mov                 eax, [pText]
inc                 eax
mov                 [pText],eax 
; !!!!!!!!!!!!!!!!!!!!!!!!!!
invoke      CharUpper, pText
invoke      SetWindowText, hwndLabel1, pText
ret

Knopka endp

Автор: piritus 22.9.2009, 21:41
Как вариант:
Код

; !!!!!!!!!!!!!!!!!!!!!!!!!!
mov eax,offset TextEdit1
inc eax
invoke lstrcpy,addr TextEdit1,eax
; !!!!!!!!!!!!!!!!!!!!!!!!!!

Автор: I_Am_Rock 22.9.2009, 21:51
Попробовал последний - работает. Спасибо. smile


Цитата(Goodwin98 @  22.9.2009,  21:22 Найти цитируемый пост)
Эх. Вы не можете  изменить по ходу программы аддрес text1. Он постоянный.

А, ясно...
Т.е. адрес переменных изменить нельзя - я правильно понял?
Но почему тогда можно изменить адрес pText? Только потому, что он еще в data прописан как offset?

Добавлено @ 21:55
Цитата(piritus @  22.9.2009,  21:41 Найти цитируемый пост)
Как вариант:

Тоже удобный вариант. Благодарю smile

Вы не можете  изменить по ходу программы аддрес text1. Он постоянный.
Получается можно? Судя из кода piritus  

Автор: Goodwin98 22.9.2009, 21:55
Цитата

Т.е. адрес переменных изменить нельзя - я правильно понял?

Аддрес - нет, только их содержание.
Цитата

Но почему тогда можно изменить адрес pText?

Тут не меняемтся ее аддрес, а только содержание 
pText - это просто переменая, как напр hwndLabel1, в которой сначала находится аддрес text1, а потои мы его меняем.
Советую посмотреть на программу из-под отладчика для лучшего понимания.
Цитата

Получается можно? Судя из кода piritus  

В этом коде копируется строчка на др место.

Автор: I_Am_Rock 22.9.2009, 22:01
Цитата(Goodwin98 @  22.9.2009,  21:55 Найти цитируемый пост)
Аддрес - нет, только их содержание.pText - это просто переменая, как напр hwndLabel1, в которой сначала находится аддрес text1, а потои мы его меняем.Советую посмотреть на программу из-под отладчика для лучшего понимания.

А как же код piritus? Там же хоть и через API, но ведь меняется именно адрес переменной. И потом в дальнейшем коде можно применять
Код

invoke      SetWindowText, hwndLabel1, addr TextEdit1

И слово выводится уже со второй буквы.

Еще раз спасибо.  smile  Плюсанул Вам репутацию. Завтра посмотрю все примеры в отладчике.  smile 

Автор: I_Am_Rock 22.9.2009, 22:19
Цитата(I_Am_Rock @  22.9.2009,  22:01 Найти цитируемый пост)
А как же код piritus? Там же хоть и через API, но ведь меняется именно адрес переменной. И потом в дальнейшем коде можно применять

Вопрос снят!  smile  Посмотрел в отладчике и понял, что адрес-то не меняется просто по тому адресу - новые данные.

Действительно, отладчик - важнейший инструмент. Буду почаще им пользоваться. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)