假设cpu执行一个指令: add #xx yy
常数xx最大有多大?如果超过32bit, 那么add xx yy这个指令不就超过32bit了吗? 这样是不对的吧? 当初自己设计cpu时,没有想到这个问题
看上面这个指令,imm立即数是有限制的!
什么操作编译器会将代码编译为立即数操作,什么代码编译为ram寻址,什么代码编译为reg寻址?
不同的指令需要不同的寻址方式,使用到某个指令了就决定了必须采用这种寻址方式!很简单,但是刚想明白!
2017.6.22
立即数不是C语言中的常量!!
2017.6.22
机器代码或汇编代码中,C中的数组和结构都是一组连续的内存字节来表示,他不区分符号或无符号数,不区分各种类型的指针,甚至不区分指针和整数!
2017.6.22
所谓的32位,64位指令集指的是操作数据宽度,即内存操作的数据宽度,不是指指令只有32位,64位,例如movasq指令可以直接操作64位立即数
2017.7.5
ARM是risc,因此所有指令是等长的; 而intel是cisc, 指令是不等长的;
2017.7.5
ARM中如何将使用ldr指令去某个内存地址的数据? 内存地址为32bit
LDR 是ARM中的指令,也是伪指令。当用 LDR r, =imd // r 为寄存器, imd为立即数
LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令。
当imd能用mov或者mvn操作时,就将它翻译成一条mov或mvn指令。当imd大于mov或mvn能够操作的数时,编译器会将imd存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到寄存器中。
32位的数可以分两次载入:
比如可以这样载入0x0c002000:
1 .text
2 mov sp, #0x0c000000 3 add sp, sp, #0x00002000