为什么SASM的调试器在存储后不显示“结果”变量更新的值?

时间:2019-11-23 19:31:29

标签: debugging assembly x86-64 debug-symbols sasm

我正在尝试在汇编中运行简单的代码-我想将地址保存到内存中。

我要将地址移到寄存器中,然后再将其移到内存中,但是由于某种原因,内存没有更新。

.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

我在做什么错了?

enter image description here

1 个答案:

答案 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