Assembly 为什么不正确地记录负值?纳斯姆

Assembly 为什么不正确地记录负值?纳斯姆,assembly,x86,nasm,Assembly,X86,Nasm,输出:resS=246。为什么呢?毕竟,“-10”值应放在al寄存器中 使用寄存器时,eax工作正常 mov al, -10 mov [_resS], al 不清楚你所说的“输出”是什么意思。例如,您是否正在打印该值(如果是,如何打印?),或者是否正在调试器中查看该值,等等 在任何情况下,8位值246和-10在两个补码中共享相同的位模式(这是大多数处理器使用的):11110110。这些位应该表示246还是-10取决于您选择将它们视为有符号值还是无符号值 但是,您的问题似乎只来自

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

使用寄存器时,eax工作正常

    mov al, -10
    mov [_resS], al

不清楚你所说的“输出”是什么意思。例如,您是否正在打印该值(如果是,如何打印?),或者是否正在调试器中查看该值,等等

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

但是,您的问题似乎只来自于修改变量的一部分
\u resS

如果我们假设您以32位值打印/检查
\u resS
,并且
\u resS
最初包含值0,则很容易看出您获得所述结果的原因:

  • \u resS
    包含0x00000000
  • mov al,-10
    ->
    al
    包含-10(或246),等于0xF6
  • mov[\u resS],al
    ->
    \u resS
    包含0x000000F6,即246
  • 在第二种情况下,您会看到:

  • \u resS
    包含0x00000000
  • mov eax,-10
    ->
    eax
    包含-10,等于0xFFFFF6
  • mov[_resS],eax
    ->
    resS
    包含0xFFFFF6,即-10

  • 不清楚你所说的“输出”是什么意思。例如,您是否正在打印该值(如果是,如何打印?),或者是否正在调试器中查看该值,等等

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

    但是,您的问题似乎只来自于修改变量的一部分
    \u resS

    如果我们假设您以32位值打印/检查
    \u resS
    ,并且
    \u resS
    最初包含值0,则很容易看出您获得所述结果的原因:

  • \u resS
    包含0x00000000
  • mov al,-10
    ->
    al
    包含-10(或246),等于0xF6
  • mov[\u resS],al
    ->
    \u resS
    包含0x000000F6,即246
  • 在第二种情况下,您会看到:

  • \u resS
    包含0x00000000
  • mov eax,-10
    ->
    eax
    包含-10,等于0xFFFFF6
  • mov[_resS],eax
    ->
    resS
    包含0xFFFFF6,即-10

  • 感谢您的帮助,但录制时未录制在0中,它是空的。“Output:”这个结论_press值在C++程序中的内存位置不能为“空”。它有一些价值。当您测试这个时,最初的值可能是0。取决于您如何和在何处声明
    \u resS
    ,这可能是预期结果,也可能只是巧合;嗯哼。如果不明确地将全局
    int
    初始化为其他值,它将初始化为零。本地非静态
    int
    将具有未定义的初始值(即其初始值可以是任何值,包括零)。修复方法是使用第二段代码,即写入变量的完整32位,而不是仅写入其最低有效字节。如果您以后不打算使用寄存器的值,您可以直接写入内存:
    mov dword[\u resS],-10
    谢谢您的帮助,但是在录制时,寄存器0中没有记录,它是空的。“Output:”这个结论_press值在C++程序中的内存位置不能为“空”。它有一些价值。当您测试这个时,最初的值可能是0。取决于您如何和在何处声明
    \u resS
    ,这可能是预期结果,也可能只是巧合;嗯哼。如果不明确地将全局
    int
    初始化为其他值,它将初始化为零。本地非静态
    int
    将具有未定义的初始值(即其初始值可以是任何值,包括零)。修复方法是使用第二段代码,即写入变量的完整32位,而不是仅写入其最低有效字节。如果以后不打算使用寄存器的值,可以直接写入内存:
    mov-dword[\u-resS],-10
    mov eax, -10
    mov [_resS], eax