学习集合:总和不太重要的字节

时间:2015-10-12 15:55:10

标签: assembly x86

所以我试图将32位变量的两个不太重要的字节相加(在.s文件中声明但在.c文件中归属)。我最初的想法是将此变量移动到%eax和%ebx,然后执行addw%ax,%bx。

以下是我所拥有的:

<Origin>
   <PackageReferenceNumber>
      <Code ref="1">0</Code>
      <Value ref="1">QAST ROW PKG 01</Value>
      <Code ref="2">33</Code>
      <Value ref="2">12345</Value>
   </PackageReferenceNumber>
</Origin>

我想返回.c结果总和......这可能吗?我在这里做些蠢事吗?

2 个答案:

答案 0 :(得分:1)

我认为sum the two less significative bytes of an 32 bits variable意味着你要做的事情。你只是将两个字节添加到自己。在您的示例中,这两个字节是05(输入为00000005h),因此您的结果是10而不是5,这是我期望的。

要将两个最低有效字节一起添加,您可以执行以下操作:

movzbl numero, %eax    # fetch least significant byte
movzbl numero+1, %edx  # fetch second byte
add %edx, %eax         # add them
ret

但是,如果你真的想要将低位词添加到自身,你可以这样做:

movzwl numero, %eax    # fetch the low word (2 bytes)
add %eax, %eax         # add to itself
ret

PS:调用约定要求保留ebx

答案 1 :(得分:0)

这与您的要求不完全相同,但低/高字节寄存器可用于获取较大值的字节而无需移位或存储/重新加载。

FocusListener fl = new FocusAdapter()
{
    public void focusGained(FocusEvent e)
    {
        String eventText = e.toString();

        if (eventText.contains("TRAVERSAL_FORWARD"))
            System.out.println("forward");
        else if (eventText.contains("TRAVERSAL_BACKWARD"))
            System.out.println("backward");
    }
};

这只是一个8位的添加,所以它可以溢出。如果这是一个问题,请使用Jester在添加之前将字节解压缩到不同的寄存器。

结果是movzwl numero, %eax # load the low 16b add %ah, %al # add the high 8 to the low 8 ,即eax的低8b。 alah的高8b,仍然保留原始数字的第二个字节。

如果这将是一个在eax中返回的整个函数,而不仅仅是作为一个更大函数的一部分的序列,那么你需要像ax那样的零扩展。 movzbl %al, %eax将签署 - 延伸至ax。 cbw是单字节操作码(代码大小小于cbw),但只写入低16位的eax,因此读取eax会导致某些CPU的部分寄存器减速。

相关问题