Assembly 为什么不正确地记录负值?纳斯姆
输出:resS=246。为什么呢?毕竟,“-10”值应放在al寄存器中 使用寄存器时,eax工作正常Assembly 为什么不正确地记录负值?纳斯姆,assembly,x86,nasm,Assembly,X86,Nasm,输出:resS=246。为什么呢?毕竟,“-10”值应放在al寄存器中 使用寄存器时,eax工作正常 mov al, -10 mov [_resS], al 不清楚你所说的“输出”是什么意思。例如,您是否正在打印该值(如果是,如何打印?),或者是否正在调试器中查看该值,等等 在任何情况下,8位值246和-10在两个补码中共享相同的位模式(这是大多数处理器使用的):11110110。这些位应该表示246还是-10取决于您选择将它们视为有符号值还是无符号值 但是,您的问题似乎只来自
mov al, -10
mov [_resS], al
不清楚你所说的“输出”是什么意思。例如,您是否正在打印该值(如果是,如何打印?),或者是否正在调试器中查看该值,等等 在任何情况下,8位值246和-10在两个补码中共享相同的位模式(这是大多数处理器使用的):
11110110
。这些位应该表示246还是-10取决于您选择将它们视为有符号值还是无符号值
但是,您的问题似乎只来自于修改变量的一部分\u resS
如果我们假设您以32位值打印/检查
\u resS
,并且\u resS
最初包含值0,则很容易看出您获得所述结果的原因:
\u resS
包含0x00000000mov al,-10
->al
包含-10(或246),等于0xF6mov[\u resS],al
->\u resS
包含0x000000F6,即246\u resS
包含0x00000000mov eax,-10
->eax
包含-10,等于0xFFFFF6mov[_resS],eax
->resS
包含0xFFFFF6,即-10不清楚你所说的“输出”是什么意思。例如,您是否正在打印该值(如果是,如何打印?),或者是否正在调试器中查看该值,等等 在任何情况下,8位值246和-10在两个补码中共享相同的位模式(这是大多数处理器使用的):
11110110
。这些位应该表示246还是-10取决于您选择将它们视为有符号值还是无符号值
但是,您的问题似乎只来自于修改变量的一部分\u resS
如果我们假设您以32位值打印/检查
\u resS
,并且\u resS
最初包含值0,则很容易看出您获得所述结果的原因:
\u resS
包含0x00000000mov al,-10
->al
包含-10(或246),等于0xF6mov[\u resS],al
->\u resS
包含0x000000F6,即246\u resS
包含0x00000000mov eax,-10
->eax
包含-10,等于0xFFFFF6mov[_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