gpt4 book ai didi

string - 无法理解寄存器和变量之间的汇编mov指令

转载 作者:行者123 更新时间:2023-12-02 11:41:44 25 4
gpt4 key购买 nike

我在 Linux 64 位上使用 NASM 汇编器。有一些关于变量和寄存器的东西我无法理解。我创建一个名为“msg”的变量:

 msg db "hello, world"  

现在,当我想写入标准输出时,我将 msg 移动到 rsi 寄存器,但是我不理解 mov 指令按位...rsi寄存器由64位组成,而msg变量有12个符号,每个符号8位,这意味着msg变量的大小为12 * 8位,大于显然是 64 位。

那么如何才能做出这样的指令:
mov rsi, msg ,不会溢出为 rsi 分配的内存。

或者 rsi 寄存器是否包含字符串第一个符号的内存位置,并且在写入 1 个符号后,它会更改为下一个符号的内存位置?

抱歉,如果我写的完全是废话,我是汇编新手,我只是暂时无法掌握它。

最佳答案

在 NASM 语法中(与 MASM 语法不同)mov rsi, symbol 将符号的地址放入 RSI 中。 (使用 64 位绝对立即数效率低下;请改用 RIP 相对 LEA 或 mov esi, symbolHow to load address of function or label into register in GNU Assembler )

mov rsi, [symbol] 将加载从 symbol 开始的 8 个字节。当您编写这样的指令时,您可以选择一个有用的位置来加载 8 个字节。

mov   rsi,  msg           ; rsi  = address of msg.  Use lea rsi, [rel msg] instead
movzx eax, byte [rsi+1] ; rax = 'e' (upper 7 bytes zeroed)
mov edx, [msg+6] ; rdx = ' wor' (upper 4 bytes zeroed)

请注意,您可以使用 mov esi, msg 因为符号地址始终适合 32 位(在默认的“小”代码模型中,所有静态代码/数据都位于虚拟的低 2GB 中)地址空间)。 NASM 使用汇编时常量(例如 mov rax, 1)为您进行此优化,但可能无法使用链接时常量。 Why do x86-64 instructions on 32-bit registers zero the upper part of the full 64-bit register?

and after writing 1 symbol it changes to the memory location of the next symbol?

不,如果您想要,您必须inc rsi。没有魔法。指针只是您可以像任何其他整数一样操作的整数,而字符串只是内存中的字节。

访问寄存器并不会神奇地修改它们。

有诸如 lodsbpop 之类的指令,它们从内存加载并递增指针(rsirsp分别),但 x86 没有任何前/后递增/递减寻址模式,因此即使您想要,也无法使用 mov 获得该行为。使用add/subinc/dec

关于string - 无法理解寄存器和变量之间的汇编mov指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47123137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com