NASM: переменная не меняется - PullRequest
0 голосов
/ 10 октября 2018

Мне нужно изменить значение первой переменной на вторую, но код, который я написал, не работает.Я попробовал это:

mov DWORD [enety_26500], enety_26501

, но программа все еще печатает меня "Привет, мир!"

Может кто-нибудь помочь?

        global _main
        extern _ExitProcess@4
        extern _printf
        section .text
_main:
        call main
        pop eax
        push    0
        call    _ExitProcess@4
        ret
print:
        push ebp
        mov ebp, esp
        mov eax, [ebp+8]
        push eax
        call _printf
        pop ebp
        push 0
        ret
main:
        push ebp
        mov ebp, esp
        push enety_26500
        call print
        pop eax
        mov DWORD [enety_26500], enety_26501
        push enety_26500
        call print
        pop eax
        pop ebp
        push 0
        ret

        section .data

        enety_26500:
                dw 'Hello, world!', 10, 0

        enety_26501:
                dw 'Hello,', 10, 0

1 Ответ

0 голосов
/ 10 октября 2018

Непонятно, что вы пытаетесь сделать.Похоже, вы пытаетесь сделать это (в C, используя более четкие имена):

const char *stra = "hello world";
const char *strb = "hello";
...

printf(stra);
stra = strb;
printf(stra);

Дело в том, что вы не можете иметь ярлык, указывающий, где находится строка, а затем попытаться изменитьэтикетка.Это не имеет смысла - метка не является контейнером или местом в себе, это просто ... метка.Либо сохраните метку в eax, либо измените ее в eax, либо сохраните метку в другой переменной:

    push    DWORD PTR sptr
    call    printf
    mov     eax, strb
    mov     DWORD PTR sptr, eax

    push    DWORD PTR sptr
    call    printf
    ....

sptr:
    .long   stra
stra:
    .string "hello world"
strb:
    .string "hello"

В любом случае что-то подобное!

Редактировать: Просто не в интересах: Если вы хотите изменить страи stra был сохранен в сегменте данных для записи (то есть: .data), вы могли бы сделать:

mov     BYTE PTR stra+5, 0

, который записал бы 0 сразу после части "hello" и завершил бы строку в этой точке.Вызов printf напрямую через stra будет выводить «hello».

...