所以我试图将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结果总和......这可能吗?我在这里做些蠢事吗?
答案 0 :(得分:1)
我认为sum the two less significative bytes of an 32 bits variable
意味着你要做的事情。你只是将两个字节添加到自己。在您的示例中,这两个字节是0
和5
(输入为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。 al
,ah
的高8b,仍然保留原始数字的第二个字节。
如果这将是一个在eax中返回的整个函数,而不仅仅是作为一个更大函数的一部分的序列,那么你需要像ax
那样的零扩展。 movzbl %al, %eax
将签署 - 延伸至ax。 cbw
是单字节操作码(代码大小小于cbw
),但只写入低16位的eax,因此读取eax会导致某些CPU的部分寄存器减速。