Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NASM:变量没有改变_Assembly_Nasm - Fatal编程技术网

Assembly NASM:变量没有改变

Assembly NASM:变量没有改变,assembly,nasm,Assembly,Nasm,我需要将第一个变量的值更改为第二个变量,但我编写的代码不起作用。 我试过这个: mov DWORD [enety_26500], enety_26501 但这个程序仍然会打印“你好,世界!” 有人能帮忙吗 global _main extern _ExitProcess@4 extern _printf section .text _main: call main pop eax p

我需要将第一个变量的值更改为第二个变量,但我编写的代码不起作用。 我试过这个:

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

不清楚你想做什么。看起来您正在尝试这样做(在C中,使用更清晰的名称):

问题是,你不能让一个标签告诉你一个字符串的位置,然后试图改变标签。这没有意义-标签本身不是一个容器或位置,它只是。。。标签。将标签存储在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”字样。

mov-DWORD[enety_26500],enety_26501
谢谢,但是如果我把mov-DWORD[enety_26500],[enety_26501]放进去,它会告诉我这不是一个有效的操作数组合。即使是这样,也不会有帮助,因为字符串没有固定的大小。如何使其有效并解决它?求求你了,我不清楚你到底想解决什么。我的意思是,如果您只想打印第二个字符串,您可以执行
push-enety_26501
。非常感谢!还有一个问题,我可以编辑stra的值吗?请注意stra(实际上是一个数字,给出了“hello world”中“h”的位置)和[stra]之间的差异,后者是实际的“h”在hello world中。无论如何,如果字符串在数据段中,你可以更改它。通常C编译器会将字符串放在只读段中,然后写入它们会导致错误。指针和地址在C中可能会有点混乱,更不用说汇编了。我发现网站“godbolt.org”向我展示C编译器如何将代码呈现到汇编中非常有帮助。如果您从列表中选择x86-64 gcc,您需要在编译器选项中添加“-m32”以获得32位汇编。尝试-O看看它如何优化它等等。如果汇编是您的事,则很有趣:-)非常感谢)抱歉,但是如何更改它?这是一个NASM问题;您正在使用GAS的MASM-like
.intel\u语法noprefix
。所以您需要
mov[sptr],eax
。(除了
mov-eax,strb
显然应该是一个
mov-eax,imm32
,具有即时地址,而不是加载。在NASM语法中,它是,但在GAS语法中,与代码的其余部分一样,您需要
mov-eax,OFFSET-strb
),但您可以只
mov[sptr],OFFSET-strb
mov     BYTE PTR stra+5, 0