Assembly x64 asm:将负值从寄存器移动到内存

Assembly x64 asm:将负值从寄存器移动到内存,assembly,x86,64-bit,x86-64,Assembly,X86,64 Bit,X86 64,假设我在.data中定义了一个名为val的字节。 假设我在寄存器r10中有一个数字,假设它是12 我正试图在r10中获得一个2s的数字,并将其存储在val中以备将来使用 所以我这样做: neg r10 mov [val], r10b 但是,当我稍后尝试在val中使用该值时(或使用调试器进行处理),它会被存储并视为无符号值,因此如果r10是-12,val现在是244,这是无符号等效值 如何在保留符号的同时将寄存器移到内存中?或者,在将内存移回另一个寄存器后,如何设置符号?有符号8位整数,即-12

假设我在
.data
中定义了一个名为
val
的字节。 假设我在寄存器
r10
中有一个数字,假设它是
12

我正试图在
r10
中获得一个2s的数字,并将其存储在
val
中以备将来使用

所以我这样做:

neg r10
mov [val], r10b
但是,当我稍后尝试在
val
中使用该值时(或使用调试器进行处理),它会被存储并视为无符号值,因此如果
r10
是-12,
val
现在是244,这是无符号等效值


如何在保留符号的同时将寄存器移到内存中?或者,在将内存移回另一个寄存器后,如何设置符号?

有符号8位整数,即
-12
存储为
244
。当您尝试使用调试器读取该值时,它会将该数字视为无符号字节,并显示
244
。如果您告诉调试器将内存视为有符号字节,它将正常工作。

作为8位数字,244 unsigned与-12 signed相同。标志保留了下来。您需要记住内存中的数字是要解释为有符号的还是无符号的。这是有意义的,但在这种情况下,如果我知道该值要解释为有符号的,我如何将其存储回寄存器并让CPU知道这一点?假设我稍后将该值移动到另一个寄存器,并想将该负数与另一个寄存器的值相加,从而得到减法?如果我按原样做的话,我加244很可能会导致8位溢出。你可能和问了一个非常类似的问题的人有关吗?加法和减法的诀窍是它们对有符号和无符号数字的作用相同,因此指令不需要知道数字是否有符号。CPU甚至在CF和OF标志中分别跟踪无符号和有符号溢出。可能有用的一件事是符号/零扩展,这是一种操作,在保持符号完整(或插入零位)的同时,将一些小字大小转换为一个较大的字大小。例如,要将
al
中的有符号数字转换为
eax
中的有符号数字,请使用
movsx eax,al
。如果您在这方面遇到问题,请发布相关代码片段。我想问题可能是您使用了错误数据大小的操作;正如我所说,如果要将数字添加到另一个数据大小的数字中,则必须将数字扩展到更大的数据大小。当数据是8位数字时,使用
neg r10
(64位否定)也会犯同样的错误
neg r10b
会更清晰。虽然这与问题没有直接关系,但如何告诉gdb将内存显示为带符号字节?现在,为了查看
val
中的内容,我正在执行
p(int)val
,这将返回一个无符号值。@Cirno这是因为您的值不是
int
。一个
int
有4个字节,但是
val
只有一个字节。尝试
p(char)val