【问题标题】:Sign extension on x64 assembly dwordx64 程序集 dword 上的符号扩展
【发布时间】:2015-07-14 14:00:08
【问题描述】:

我目前正在使用 VS2013 中的 MASM 对 x64 程序集进行一些编程。我知道,当您向汇编过程(在 C++ 中定义为 extern "C")提供整数时,整数会进入 rcx 寄存器。在这种情况下,整数是 32 位,即 dword 的大小。我唯一不确定的是编译器在将 dword 放入 rcx 时是否执行符号扩展或零扩展(将高 32 位归零并丢失 dword 的符号)。如果有人能确认编译器在这种情况下做了什么(因为我不能手动使用 movsxd 并自己保留符号),我们将不胜感激。

【问题讨论】:

    标签: c++ assembly visual-studio-2013 64-bit masm


    【解决方案1】:

    32 位整数在寄存器的 32 位部分(ecx 等)中传递,这意味着上半部分为零。没关系,符号不会丢失,只是不会无用地复制到 32 位高位。如果您只使用寄存器的 32 位部分(这在操作 32 位数据时是正常的),那么一切都应该如此。只有在向上转换到 64 位时才需要符号扩展。

    【讨论】:

    • 如果我要执行“添加 rdx,rcx”,其中 rdx 是一个 qword (int64),鉴于 rcx 的上 32 位现在为零,这不会导致问题吗?
    • @user2379150 它会设置错误的标志。还有,为什么要这么做?您可以只使用 32 位操作来处理 32 位数据,也可以节省一些空间。
    • 这个想法是向 qword 添加一个 dword,但如果我向 dword 添加一个 dword,我可以达到 dword 的 32 位限制,而如果我有一个 qword 我不会。 "add edx,ecx" 不会使用高 32 位,那么如果将 edx 推到 32 位上会发生什么?
    • @user2379150 然后它溢出,设置溢出标志。如果你想要更大的结果,你可以先符号扩展。好吧,你写了你不能,但这没有任何意义 - 你可以在必要的地方扩展它,它不必从一开始就扩展。
    • 所以假设 var1 是 int32 并且 var2 是 int64,你是说执行“add edx,ecx”然后执行“movsxd rcx,ecx”然后“add rdx,rcx”更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2011-12-31
    相关资源
    最近更新 更多