好友
阅读权限 35
听众
最后登录 1970-1-1
飘零星夜
发表于 2021-2-24 15:59
本帖最后由 飘零星夜 于 2021-7-24 09:33 编辑
第一次不在水区发帖子,如有违规,请版主删帖谅解。
//HCS12X 是 飞思卡尔架构。记录一下汇编中可能用到的知识,错误在所难免。
1,符号约定:
1.1,寄存器:这里只记录几个逆向常用的寄存器。
2个8位的寄存器:A,B; A 和 B 联合在一起组成 16位的寄存器:D; //D = (A<<8) +B.
2个16位的寄存器:X,Y.
1个16位堆栈指针:SP.
1个16位程序指针:PC.//PC总是指向正在运行的指令的下一条指令
1个16位的状态寄存器:CCR。
//CCR从高到低bit: U 0 0 0 0 IPL[2:0] S X H I N Z V C .通常我们只关心Z(标志) 和 C(溢出/借位标志)。
1.2,内存和地址:
代码页寄存器(8bit):PPAGE.
8bit的内存写为M, 16bit写为M:M+1, 32bit写为M~M+3 .
用"()"括起来表示内存里面的内容。
%开头表示2进制,$开头表示16进制,#表示立即数.//#$16 表示立即数0x16
2,寻址模式:
所有有效地址都是16位的。//不包含地址的指令除外。
全局地址的本质上也是16位偏移 + 段基址。
INST 纯指令,无操作数
INST #8I 8bit立即数
INST #16I 16bit立即数
INST 8a 8bit前面加00 补全范围0x0000~0x00ff的内存地址。
INST 16a 16bit的内存地址。
INST r8 相对寻址:8bit +PC.
INST r16 相对寻址:16bit +PC.
INST 5I,R 5bit偏移加到寄存器R上。
INST 9I,R 9 bit偏移加到寄存器R上。
INST 16I,R 16bit偏移加到寄存器R上。
INST 3I,-R 寄存器R减去3bit偏移,然后用于运算.//类似于 C语言的 --i
INST 3I,+R 寄存器R加上3bit偏移,然后用于运算.
INST 3I,R- 先使用R, 然后寄存器R减去3bit偏移.//类似于 C语言的 i--
INST 3I,R+ 先使用R, 然后寄存器R加上3bit偏移.
举例:
纯指令:INX 表示 X++;
立即数:LDAA #$55 表示 A = 0x55; LDX #$1234 表示 X = 0x1234;
立即数:LDAA $55 表示 A = [0x55]; LDX $1234 表示 X = [0x1234];//[]表示从内存地址取值
相对寻址(只有分支指令才有):BEQ #$12 表示 if (Z == 1) PC = PC + 2 + 0x12.
3,程序运行:所有的操作都在0x0000到0x10000范围内进行(64K)理解为电脑的内存条。
3.1,程序将所有的硬件寄存器和系统寄存器映射到0x0000~0x0800的2K内存中。
3.2,EEPROM是用来存放重要数据的存储器,固定大小4K,例如 账号 密码 。
3.2.1,根据需要,每次从EEPROM中读取1k数据到0x0800~0x0c00中,
3.2.2,将EEPROM最高1k映射到0x0c00~0x1000中。
3.3.1,根据需要,每次从RAM中读取4k数据到0x1000~0x2000中,
3.3.2,将RAM最高8k映射到0x2000~0x4000中,这8k通常是全局变量。
3.4,代码FLASH: //相当于电脑的硬盘
3.4.1,将地址0x7F4000的16K代码映射到0x4000~0x8000,
3.4.2,将地址0x7FC000的16K代码映射到0xC000~0x10000,
3.4.3,根据需要,每次从代码FLASH中读取4k数据到0x08000~0xc000中。
免费评分
参与人数 1 吾爱币 +2
热心值 +1
收起
理由
苏紫方璇
+ 2
+ 1
欢迎分析讨论交流,吾爱破解论坛有你更精彩!
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。