Изменение переменной, адрес которой находится в стеке - PullRequest
0 голосов
/ 22 ноября 2018

так скажем, это мой основной

main PROC
    sub esp, 4
    push OFFSET variableName
    call changeVariable

changeVariable PROC
    push ebp
    mov ebp, esp

Как я могу изменить variableName на другое значение (скажем, 10) в процедуре changeVariable?

Я пытался

mov OFFSET[ebp+8], 10  ;ebp[+8] is the position in stack that holds address of variableName

, но это не работает

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вы нажимаете указатель, как указано в комментарии, вам нужно почтить его.
См. этот пример Годболта , где этот код C

void bar(int* c)
{
    *c = 10;
}

void foo(int c)
{
        c = 10;
}

int myVar;

int main()
{
    bar(&myVar);

    foo(myVar);
}

собран в

bar:
        push    ebp
        mov     ebp, esp

        ;What you need to do:
        mov     eax, DWORD PTR [ebp+8]     ;Read the pointer
        mov     DWORD PTR [eax], 10        ;Deference it

        nop
        pop     ebp
        ret

foo:
        push    ebp
        mov     ebp, esp

        ;What you are doing:
        mov     DWORD PTR [ebp+8], 10  ;Overwriting an argument

        nop
        pop     ebp
        ret

main:
        push    ebp
        mov     ebp, esp

        ;This is you call exactly
        push    OFFSET FLAT:myVar
        call    bar
        add     esp, 4

        ;How one would call the foo version
        mov     eax, DWORD PTR myVar
        push    eax
        call    foo
        add     esp, 4


        mov     eax, 0
        leave
        ret

Обратите особое внимание на то, что код C foo и bar соответствуют.
Это может помочь вам понять различия.

0 голосов
/ 22 ноября 2018

Что касается вашей попытки,

mov OFFSET[ebp+8], 10

Косвенные или индексированные операнды недопустимы для оператора OFFSET, я думаю, вы неправильно поняли возвращаемое значение OFFSET, которое является непосредственным операндом, "эффективный адресof data ", также возвращаемое значение оператора OFFSET сделает операнд назначения инструкции MOV непосредственным операндом, который недопустим.

В вашем случае, если у вас есть смещение variableNameуже в стеке, сначала загрузите смещение во временном регистре и просто используйте косвенную разыменование операнда, но вы должны указать размер с помощью оператора PTR.

mov esi,[ebp+8]
mov DWORD PTR[esi],10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...