×
单片机 > 单片机程序设计 > 详情

汇编代码、机器码和存储器的关系以及数据的表示

发布时间:2024-05-21 发布时间:
|

即使使用C/C++或者其他高级语言编程,最后也会被编译工具转换为汇编代码,并最终作为机器码存储在内存、硬盘或者其他存储器上。在调试程序时,经常需要阅读它的汇编代码,以下面的汇编代码为例:


2023404: e5901000 ldr r1, [r0]

2023408: e3c110ff bic r1, r1, #255 ; 0xff

202340c: e3c11cff bic r1, r1, #65280 ; 0xff00

2023404、2023408、202340c是这些代码的运行地址,就是说运行前,这些指令必须位于内存中的这些地址上; e5901000、e3c110ff、e3c11cff是机器码。运行地址、机器码都以16进制表示。CPU用到的、内存中保存的都是机器码,图1是这几条指令在内存中的示意图。

图1. 内存中的机器码


"ldr r1, [r0]"、"bic r1, r1, #255"、"bic r1, r1, #65280"是这几个机器码的汇编代码──所谓汇编代码仅仅是为了方便我们人类读、写而引入的,机器码和汇编代码之间也仅仅是简单的转换关系。


参考CPU的数据手册可知,ARM的数据处理指令格式为:

以机器码0xe3a0244e为例:


[31:28] = 0b1110, 表示这条指令无条件执行;

[25] = 0b1, 表示 Operand2 是一个立即数;

[24:21] = 0b1101, 表示这是 MOV 指令, 即 Rd : = Op2;

[20] = 0b0, 表示这条指令执行时不影响状态位;

[15:12] = 0b0010, 表示 Rd 就是 r2;

[11:0] = 0x44e, 这是一个立即数;

立即数占据机器码中的低12位表示:最低8位的值称为immed_8,高4位称为rotate_imm。立即数的数值计算方法为:=immed_8循环右移(2*rotate_imm)。对于"[11:0] =0x44e",其中immed_8=0x4e,rotate_imm=0x4,所以此立即数等于0x4e000000。


综上所述,机器码0xe3a0244e的汇编代码为:


mov r2, #0x4e000000

mov r2, #1308622848。

上面的0x4e000000和1308622848是一样的,之所以强调这点,是因为很多初学者问这样的问题:"计算机中怎么以 16 进制保存数据?以 16 进制、 10 进制保存数据有什么区别?"这类问题与如下问题相似:桌子上有12个苹果,吃了一个,请问现在还有几个?你可以回答11 个、0xb个、十一个、eleven个、拾壹个。所谓16进制、10进制、8进制、二进制,都仅仅是对同一个数据的不同表达形式而已,这些不同的表达形式也仅仅是为了方便我们人类(又说了这个词一遍)读写而已,它们所表示的数值及它在计算机中的保存方式是完全一样的。


完毕!


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯