如何将数据从寄存器移入内存

问题描述 投票:1回答:1

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

我将地址移入寄存器,然后将其移入内存,但由于某种原因,内存未更新。

.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

assembly x86-64 att
1个回答
1
投票

您的调试器正在查看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命令转储内存时,在存储之后我会找到一个x0
看来您的系统选择了一个不同的实例,其中包含一个指向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
© www.soinside.com 2019 - 2024. All rights reserved.