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