我正在尝试在汇编中运行简单的代码-我想将地址保存到内存中。
我要将地址移到寄存器中,然后再将其移到内存中,但是由于某种原因,内存没有更新。
.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
我在做什么错了?
答案 0 :(得分:3)
您的调试器正在查看错误的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 high address
0x00007ffff7f85260 result # where the dynamic linker puts shared libs
0x00007ffff7f85660 result
0x00007ffff7f86ab8 result
0x00007ffff7f86f48 result
当我执行p /x &result
来查看调试器将该符号解析到的地址时,我得到了一个glibc实例,而不是.data
中的该实例。部分。具体来说,我得到的地址为0x7ffff7f85660
,内容为0。
当我使用强制转换为p /x (unsigned long)result
打印 value 或使用GDB的x
命令转储内存时,在存储之后我发现了0
(gdb) x /xg &result
0x7ffff7f85660 <result>: 0x0000000000000000
您的系统似乎选择了一个不同的实例,其中包含一个指向libc地址或其他内容的指针。我无法从您的图片中复制粘贴。这些其他result
变量可能是static int result
或glibc中各种.c
文件中的任何变量。 (顺便说一句,这看起来好像是编码风格不佳的征兆;通常,您要返回一个值而不是设置一个全局值或静态值。但是glibc太旧了,并且/或者其中有些是合理的。)
您的result:
是编译器为static void* result
做的汇编程序,如果没有对其进行优化的话。除非它会被初始化为零,否则将其放在.bss
中而不是.data
中。
您正在使用SASM。我使用GDB来获取有关正在发生的事情的更多详细信息。在SASM的调试窗格中查看result
的地址可能会有所帮助。但是,既然我们已经使用GDB识别了问题,那么我们可以更改您的源以修复SASM。
您可以使用.globl result
将其设置为外部可见的符号,以便在调试器查找符号时“赢得”。
我添加了该内容,并再次使用gcc -g -no-pie store.s
进行了编译。现在,它可以按预期运行,p /x (unsigned long)result
给出了0x404028