NASM:变量未更改

时间:2018-10-10 16:20:31

标签: assembly nasm

我需要将第一个变量的值更改为第二个,但是我编写的代码无法正常工作。 我尝试过:

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 :(得分:0)

不清楚您要做什么。看来您正在尝试执行此操作(在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,并且stra存储在可写数据段(即.data)中,则可以执行以下操作:

mov     BYTE PTR stra+5, 0

,它将在“ hello”部分之后写入0,并在该点终止字符串。直接在stra上调用printf会打印“ hello”。