【问题标题】:NASM: variable is not changingNASM:变量没有改变
【发布时间】:2018-10-10 16:20:30
【问题描述】:

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

mov DWORD [enety_26500], enety_26501

但程序仍然打印我 “Hello, world!”

谁能帮忙?

        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

【问题讨论】:

  • mov DWORD [enety_26500], enety_26501 enety_26501的地址覆盖enety_26500的前4个字节。
  • 谢谢,但如果我输入 mov DWORD [enety_26500], [enety_26501] 它会显示错误
  • 这不是操作数的有效组合。即使是这样也无济于事,因为字符串没有固定的大小。
  • 如何使其生效并解决?请帮忙
  • 不清楚您真正要解决什么问题。我的意思是,如果您只想打印第二个字符串,您可以执行push enety_26501

标签: assembly nasm


【解决方案1】:

不清楚你想做什么。看起来您正在尝试这样做(在 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”。

【讨论】:

  • 非常感谢!还有一个问题,我可以编辑 stra 的值吗?
  • 请注意 stra (实际上是一个数字,为​​您提供“hello world”中“h”的位置和 [stra],它是 hello world 中的实际“h”)之间的区别。无论如何,如果字符串在数据段中,是的,您可以更改它。通常 C 编译器会将字符串放在只读段中,然后写入它们会导致错误。
  • 指针和地址在 C 中可能有点混乱,更不用说汇编了。我发现网站“godb​​olt.org”非常有助于向我展示 C 编译器如何将代码呈现为汇编。如果从列表中选择 x86-64 gcc,则需要在编译器选项中添加“-m32”以获得 32 位汇编。试试 -O 看看它是如何优化它的。如果你喜欢组装,这很有趣:-)
  • 非常感谢)抱歉,怎么改呢?
  • 这是一个 NASM 问题;您正在使用 GAS 的类似 MASM 的.intel_syntax noprefix。所以你需要mov [sptr], eax。 (除了mov eax, strb 显然应该是带有直接地址的mov eax,imm32,而不是负载。在NASM 语法中,它是,但在GAS 语法中,就像你需要mov eax, OFFSET strb 的其余代码一样。)但是你可以mov [sptr], OFFSET strb
猜你喜欢
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2022-12-06
  • 2021-06-24
  • 1970-01-01
相关资源
最近更新 更多