我正在尝试在汇编中运行简单的代码-我想将地址保存到内存中。
我将地址移入寄存器,然后将其移入内存,但由于某种原因,内存未更新。
.data
str1: .asciz "atm course number is 234118"
str2: .asciz "234118"
result: .space 8
.text
.global main
main:
xorq %rax, %rax
xorq %rbx, %rbx
leaq str1, %rax
mov %rax, result(,%rbx,1)
ret
我在做什么错?
您的调试器正在查看result
的错误实例。您的代码始终很好(尽管效率很低;请使用mov %rax, result(%rip)
且不要将索引归零,或使用mov %rax, result(%rbx,,)
将字节偏移用作“基础”而不是“索引”,这样更有效)。
glibc包含几个result
符号,在GDB中info var result
显示:
All variables matching regular expression "result":
Non-debugging symbols:
0x000000000040404b result # in your executable, at a normal static address
0x00007ffff7f54f20 result_type
0x00007ffff7f821b8 cached_result
0x00007ffff7f846a0 result # in glibc, at a normal address for a shared lib
0x00007ffff7f85260 result
0x00007ffff7f85660 result
0x00007ffff7f86ab8 result
0x00007ffff7f86f48 result
[[当我执行p /x &result
以查看调试器将该符号解析到的地址时,我得到了一个glibc实例,not您的.data
部分中的实例。具体来说,我得到了[ C0]作为地址,内容= 0。
0x7ffff7f85660
来打印value
时,或使用GDB的p /x (unsigned long)result
命令转储内存时,在存储之后我会找到一个x
。0
看来您的系统选择了一个不同的实例,其中包含一个指向libc地址的指针或其他内容。我无法从您的图片中复制粘贴。这些其他(gdb) x /xg &result 0x7ffff7f85660 <result>: 0x0000000000000000
变量可能是result
或glibc中各种static int result
文件中的变量。 (顺便说一句,这看起来像是编码风格不佳的征兆;通常,您要返回一个值而不是设置一个全局或静态值。但是glibc很旧,并且/或者其中有些是合理的。)您的
.c
是编译器为result:
创建的asm,如果没有对其进行优化的话。除外,因为它是零初始化的,所以将它放在static void* result
而不是.bss
中。您正在使用SASM。我使用GDB来获取有关正在发生的事情的更多详细信息。在SASM的调试窗格中查看
.data
的地址可能有所帮助。但是,既然我们已经使用GDB识别了问题,我们就可以更改您的源以修复SASM。您可以使用
我添加了该代码,然后再次使用result
将其设置为外部可见的符号,以便在调试器查找符号时“赢得”。.globl result
进行编译。现在它可以按预期运行,gcc -g -no-pie store.s
赋予p /x (unsigned long)result