x64 asm奇怪的行为

时间:2017-09-22 06:49:57

标签: assembly 64-bit x86-64

有人可以帮助我理解x64 asm行为吗?我找不到任何类型的文件。

所以,基本上,我们有:

  • x64注册RAX
  • x32注册EAX
  • x16注册AX
  • x8注册AL

现在代码:

mov rax, -1 (0xFFFFFFFFFFFFFFFF)
add al, 1

结果将是0xFFFFFFFFFFFFFF00(正确,al寄存器溢出,但我们只更改AL 1个字节)

mov rax, -1 (0xFFFFFFFFFFFFFFFF)
add ax, 1

结果将是0xFFFFFFFFFFFF0000(正确,ax寄存器溢出,但我们只更改AX 2个字节)

mov rax, -1 (0xFFFFFFFFFFFFFFFF)
add eax, 1

结果将是0x0000000000000000(wtf?,eax寄存器溢出,但结果改变所有8个字节而不是4.为什么它是0x0000000000000000而不是0xFFFFFFFF00000000)

1 个答案:

答案 0 :(得分:1)

  

32位操作数生成32位结果,零扩展为64位   导致目的地通用寄存器。

多数民众赞成。谢谢!

def permute(seq):
    if not seq:
        yield seq
    else:
        for i in range(len(seq)):
            rest = seq[:i]+seq[i+1:]
            for x in permute(rest):
                yield seq[i:i+1]+x

print(list(permute('stack')))

结果确认了这一点,并将为0x0000000066666667