我本仁慈,奈何苍天不许
分类: LINUX
2013-12-06 18:07:11
1、为什么没有算术左移?
比如-37算术右移:
原码:1 0 1 0 0 1 1 0
反码:1 1 0 1 1 0 0 1
补码:1 1 0 1 1 0 1 0
右移 1 1 1 0 1 1 0 1(这里是算术右移一位,最右边的一位去掉,然后左边位补上符号位)
原码 1 0 0 1 0 0 1 1 (补码取反加1)结果时-19
经验证这种算术右移对于负偶数,相当于除以2;但是对于负奇数相当于除以2再减1。
逻辑左移和算术左移是一样的,都是在后面补0。
c右移的规则是:无符号数右移时左边高位移入0;有符号数右移时:1.符号位为0,移入0;2.符号位为1,有的系统移入1(算术右移),有的系统移入0(逻辑右移)。
经验证vc和gcc均默认为算术右移,上面的汇编代码也说明了这一点,有unsigned时右移采用的是shr(shift logical right)逻辑右移,无unsigned时采用sar(shift arithmetic right)算术右移。
《c和指针》中也建议不要对有符号数进行>>操作,所以为了确保结果一定,>>时把数值转成unsigned。
又试了一下<<,发现signed和unsigned都是采用shl逻辑左移,应该是shl和sal效果都一样,所以编译器就统一采用shl。
试验int 0x80000000 << 1结果为0,说明符号位对左移没影响。
2、位置无关码的好处(相对于绝对寻址而言)
位置无关码是在程序连接阶段用的,因为那个时候所有的代码还都存放在Flash中,如果用绝对地址去内存中取值,那个时候由于代码还没有被移植到内存中去,故那个时候内存中对应地址的值不存在,所有还得用位置无关码在Flash中查找相关的值:ldr pc,[pc,#offset]
3、如果是ARM能执行的文件,第一条指令 一定在最高位上是0XE
ACPCS:
1、函数输入参数,用R0--R3,函数的返回值用R0来表示
4、位置无关的代码
ldr pc,[pc,#offset]
5、有效立即数
判断方法:
1、用8bit的盒子,去框住所有的有1的有效数字
0xff1
2、框住后的0,能通过偶数次移走
6、
栈:
top
满 空
递增 递减
C语言中的栈:
满递减栈
要求是:栈顶指针指向高地址,
top先--
LDMFD sp!,{r0,r1,r2}
STMFD sp!,{r0,r1,r2}
7、Makefile中的赋值:
A):= 相当于C语言中的普通赋值,如果后面重复赋值,则前面的值会被覆盖;
如:A := 10
A : = 20
则此时A 的值为20,前面的10被覆盖
B) += 相当于累加的方式赋值;
如:A += 10
A += 20
则此时A 为10 20(10和20之间为空格)
C) ?= 先判断变量在前面定义了吗,没有定义则使用,如果定义了则就不用了