当前位置: 首页 > 知识库问答 >
问题:

零扩展寄存器的一部分[重复]

汪晨
2023-03-14

我正在调试以下函数:

_print_func:
    mov rdx, 0xFFFFFFFFFFFFFFFF
    mov rax, 0x01
    mov rdi, 0x01
    mov rsi, str
    movzx dx, byte [str_len] ; <--- Here
    syscall
    ret

函数是用

nasm -g -f elf64 2.asm
rdx            0xffffffffffff000d       -65523
_print_func:
    mov rdx, 0xFFFFFFFFFFFFFFFF
    mov rax, 0x01
    mov rdi, 0x01
    mov rsi, str
    movzx edx, byte [str_len] ; dx replaced with edx
    syscall
    ret
rdx            0xd      13

共有1个答案

宋鸿云
2023-03-14

当您写入16位寄存器时,只有对应的64位寄存器的这16位被改变。但是,当写入32位寄存器时,对应的64位寄存器的其他32位将被清除。这是长模式(64位模式)中引入的怪癖之一。

 类似资料:
  • 我正在使用x86 Assembly,我遇到了使用指令的需要。 我的代码片段过去是这样的: 其中<代码> 所以我的程序正在命中未定义的行为,在这种情况下是一个无限循环,在检查了很长时间可能出错的地方之后,我认为我必须使用,因为 实际上将结果存储在< code>ax中。因此,我在< code>ax中有一个有符号的结果,而我希望在< code>al中有一个无符号的(有上溢/下溢)结果。 所以我的问题是:

  • 本文向大家介绍Intel x86 Assembly& Microarchitecture 调零寄存器,包括了Intel x86 Assembly& Microarchitecture 调零寄存器的使用技巧和注意事项,需要的朋友参考一下 示例 将寄存器归零的明显方法是MOV在0—例如: 请注意,这是一个5字节指令。 如果您愿意破坏标志(MOV从不影响标志),则可以使用XOR指令将寄存器与其自身按位异

  • 具体是: 注意,我关心的是旧的x86 linux CPU,而不是现代的x86_64 CPU,那里的分段工作方式不同。

  • 所以,我有两个问题: > 我认为这种尴尬的行为必须在某个地方记录下来,但我似乎找不到详细的解释(关于64位寄存器的32位高值是如何被清除的)。对的写入总是擦除,还是更复杂?它是否适用于所有64位寄存器,或者有一些例外? 一个非常相关的问题提到了同样的行为,但是,唉,再次没有确切的文档参考。 只是我,还是这整件事看起来真的很奇怪和不合逻辑(即eax-ax-ah-al,rax-ax-ah-al有一种行

  • Vim提供了许多寄存器。可以将这些寄存器用作多个剪贴板。使用多个文件时,此功能非常有用。在本章中,将讨论以下主题内容 - 复制寄存器中的文本 粘贴寄存器中的文本 列出可用的寄存器 寄存器类型 1. 复制寄存器中的文本 对于复制,可以使用普通的命令,即并将其存储在寄存器中,可以使用以下语法 - 例如,要复制寄存器中的文本,请使用以下命令 - 2. 粘贴寄存器中的文本 从寄存器粘贴文本 - 例如,下面

  • 当前的Perl 5虚拟机是一台堆栈机器。 它通过将操作保持在堆栈上来传递操作之间的值。 操作将值加载到堆栈上,执行他们需要执行的操作并将结果放回堆栈。 这很容易使用,但速度很慢。 要将两个数字相加,您需要执行三次堆栈推送和两次堆栈弹出。 更糟糕的是,堆栈必须在运行时增长,这意味着在您不想分配内存时分配内存。 因此,Parrot将打破虚拟机的既定传统,并使用寄存器架构,更类似于真实硬件CPU的架构。