如果值已签名或未签名,汇编代码如何知道?

时间:2016-10-27 05:30:30

标签: assembly unsigned signed msp430 texas-instruments

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

3 个答案:

答案 0 :(得分:5)

为什么您认为汇编代码必须“知道”某个值是已签名还是未签名?

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

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

unsigned int a = 5;
unsigned int b = 0xFFFFFFFA;
unsigned int c;
c = a + b; // results in 0xFFFFFFFF

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

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

结果:

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

unsigned int a, b;
if(a > b) { ... }

结果:

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

答案 1 :(得分:2)

除非您这样说,否则机器不关心或知道签名或未签名的内容。

在汇编程序开发人员居住的级别,机器是一块砖,你就是指挥。您必须足够了解机器指令集的合同以及flags之类的内容,以确保确定性结果。

答案 2 :(得分:1)

某些处理器指令是有符号的,有些则不是,如果你声明一个C中的var,这是一个无符号指令,将使用无符号指令编译成汇编(通常执行速度更快) 如果您正在使用汇编,则必须选择您真正需要的说明。