为什么错误地记录了负值? NASM

时间:2016-02-28 14:31:31

标签: assembly x86 nasm

    mov al, -10
    mov [_resS], al

输出:resS = 246.为什么?毕竟,“-10”值应放在al寄存器中。

使用寄存器eax正常工作。

mov eax, -10
mov [_resS], eax

1 个答案:

答案 0 :(得分:3)

"输出" 并不清楚你的意思。即你在打印这个值(如果是这样,怎么样?),或者你是在调试器中看它等等?

在任何情况下,8位值246和-10在两个补码中共享相同的位模式(这是大多数处理器使用的):11110110。这些位是应该表示246还是-10取决于您是选择将它们视为有符号值还是无符号值。

但是,您的问题似乎只来自修改变量_resS的部分内容 如果我们假设您打印/检查_resS为32位值,并且_resS最初包含值0,那么您很容易理解为什么会得到您描述的结果:< / p>

  1. _resS包含0x00000000
  2. mov al,-10 - &gt; al包含-10(或246),等于0xF6
  3. mov [_resS], al - &gt; _resS包含0x000000F6,即246
  4. 在第二种情况下,你得到了这个:

    1. _resS包含0x00000000
    2. mov eax,-10 - &gt; eax包含-10,等于0xFFFFFFF6
    3. mov [_resS], eax - &gt; resS包含0xFFFFFFF6,即-10。