Assembly 汇编代码如何知道值是有符号的还是无符号的?

Assembly 汇编代码如何知道值是有符号的还是无符号的?,assembly,unsigned,signed,msp430,texas-instruments,Assembly,Unsigned,Signed,Msp430,Texas Instruments,当我的代码有时将某个值视为有符号值,有时在比较值时将其视为无符号值时,我感到非常困惑。代码如何知道一个值是有符号的还是无符号的?如果在C中声明一个无符号的变量,则某些处理器指令是有符号的,而另一些则不是,它将编译成具有无符号指令的程序集(通常执行得更快) 如果使用汇编,则必须选择真正需要的指令。为什么您认为汇编代码必须“知道”值是有符号的还是无符号的 对于大多数操作,签名操作和使用签名操作的结果相同: signed int a = 5; signed int b = -6; // 0xFFFFF

当我的代码有时将某个值视为有符号值,有时在比较值时将其视为无符号值时,我感到非常困惑。代码如何知道一个值是有符号的还是无符号的?

如果在C中声明一个无符号的变量,则某些处理器指令是有符号的,而另一些则不是,它将编译成具有无符号指令的程序集(通常执行得更快)
如果使用汇编,则必须选择真正需要的指令。

为什么您认为汇编代码必须“知道”值是有符号的还是无符号的

对于大多数操作,签名操作和使用签名操作的结果相同:

signed int a = 5;
signed int b = -6; // 0xFFFFFFFA
signed int c;
c = a + b; // results in -1 which is 0xFFFFFFFF
以及:

有些例外是划分和比较。在这种情况下,大多数CPU对有符号和无符号操作有不同的汇编指令。这里的示例是x86汇编程序,但msp430应该类似:

signed int a, b;
if(a > b) { ... }
结果:

mov eax, [a]
cmp eax, [b]
jle elsePart ; Note the "L" in "jle"
mov eax, [a]
cmp eax, [b]
jbe elsePart ; Note the "B" in "jbe"
以及:

结果:

mov eax, [a]
cmp eax, [b]
jle elsePart ; Note the "L" in "jle"
mov eax, [a]
cmp eax, [b]
jbe elsePart ; Note the "B" in "jbe"

机器不关心或不知道什么是已签名或未签名的,除非你告诉它


在汇编程序开发人员居住的层次上,机器是一块砖,而您是指挥。您必须充分了解机器指令集的契约以及
标志等内容,以确保确定的结果。

如果您正在编写汇编代码,则您有责任知道何时使用哪些指令。如果您使用其他语言编程,则编译器或解释器将根据您在代码中使用的数据类型负责。除了特别有符号或无符号的指令外:它不知道。是你写的代码谁知道呢。例如,比较将设置或清除各种标志,而不知道您对该位模式的使用是有符号的还是无符号的。您可以使用不同版本的分支指令,根据需要测试不同的标志组合。如果一条指令从结果的m.s.位设置符号标志,而你的值是无符号的,那么你可以忽略它。你能给我举个例子吗?坦率地说,它不在乎。Signed与unsigned只是一个表示和解释问题。请参阅:您只需在完成某项操作后测试相应的标志。(此问题的x86标志看起来基本上与我在上一个问题中快速查看MPS430时看到的MPS430标志相同)。大多数指令(例如add/sub)都不在乎,并且这两个指令都是相同的。也许你在考虑MIPS,其中有ADD和ADDU,区别在于ADD在溢出时触发异常(或者类似的IIRC)。通常有符号与无符号仅对右移、除法和整数乘法(字*字->双字结果)起作用。乘法的下半部分(即与输入操作数的宽度相同)是相同的,无论有符号还是无符号。(作为2的补充)。@rcgldr:我在评论中确实指出了所有这些案例。我想我指的是实际程序中的指令数,而不是指令集的分数。但我的主要观点是,许多指令不是有符号或无符号的,它们只是指令。这个答案似乎意味着,对于签名和未签名,你总是需要不同的说明,即使是添加说明,事实并非如此。@PeterCordes-删除了我之前的评论,它是针对另一篇文章的,但你已经涵盖了它。稍后我会删除此评论。回答得很好。还有一个主要的区别是,在高级语言中,如马丁(即C++、C++、C),如果你不标记它有符号/未签名,编译器会处理额外的细节,这些细节会使你的计算看起来不正确。例如,如果您尝试(0-1)=-1,但使用无符号整数,您将得到FFFFFFFF,如Martin所述。实际上是-1。只是高级语言没有向您显示a-1,在这种情况下,b/c您告诉它您不需要“签名”数字。只是一些可能帮助他人的额外信息。不过答案很好。