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

2020-03-26来源: eefocus关键字:汇编代码  机器码  存储器  数据

即使使用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进制、二进制,都仅仅是对同一个数据的不同表达形式而已,这些不同的表达形式也仅仅是为了方便我们人类(又说了这个词一遍)读写而已,它们所表示的数值及它在计算机中的保存方式是完全一样的。


完毕!

关键字:汇编代码  机器码  存储器  数据 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492642.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:常用的汇编指令介绍
下一篇:Exynos4412芯片的时钟管理单元

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8S汇编代码分析
其中.asm文件是汇编代码的源文件,.inc文件是包含文件,类似于C语言当在的.c文件和.h文件。接下来让我们来分析一下这三个文件。(分析汇编代码最好也要对STM8单片机的启动流程有所了解,可以看我的另一篇博文http://blog.csdn.net/u010093140/article/details/49982879) 首先是看mapping.inc文件:    ;------------------------------------------------------    ; SEGMENT MAPPING FILE AUTOMATICALLY GENERATED BY
发表于 2020-02-01
STM8S汇编代码分析
STM8S103F单片机编程——在C文件中嵌入汇编代码
最近在使用STM8S103F单片机,需要在C程序中嵌入汇编代码。经过搜索,找到下面的解决方法。方法1:方法2:上面的内容摘自COSMIC的安装目录下,COSMICCXSTM8_32KDocsCXSTM8_UsersGuide.pdf
发表于 2020-01-31
STM8S103F单片机编程——在C文件中嵌入汇编代码
STM8S103-STVD建立汇编代码项目
STVD本来就比较少人用,STVD汇编就更少人用了,不过STM8汇编我自己还是满喜欢的,现在工作是做计算机软件方面的,单片机基本没有用到了,但不想让这些知识就这么被淡忘了,希望通过博客把知识固化下来,再者网上关于STM8汇编的资料少之又少,也想着为可以填补这份空白尽点小力。这里先给个很简单的建立汇编代码工程的流程,有空在讲解一下汇编代码的编写。 1. 这里的打开STVD的界面。  2. 选择New Workspace建立新的工作空间(里面可以同时容纳多个工程)。  3. 选择Create workspace and project。这个选择会工作空间和项目一起建立,你也可以按需
发表于 2020-01-31
STM8S103-STVD建立汇编代码项目
ARMv7汇编代码分析
a){ a++; return a;} int func2(int b){ b=b*b; return b;}2、交叉编译生成ARM汇编代码:# arm-none-linux-gnueabi-gcc -march=armv7-a  callfunc.c  -S -o callfunc.asm生成ARMv7的汇编代码如下: .arch armv7-a .fpu softvfp .eabi_attribute 20, 1 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25
发表于 2020-01-18
STM8S103-STVD建立汇编代码项目
STVD本来就比较少人用,STVD汇编就更少人用了,不过STM8汇编我自己还是满喜欢的,现在工作是做计算机软件方面的,单片机基本没有用到了,但不想让这些知识就这么被淡忘了,希望通过博客把知识固化下来,再者网上关于STM8汇编的资料少之又少,也想着为可以填补这份空白尽点小力。这里先给个很简单的建立汇编代码工程的流程,有空在讲解一下汇编代码的编写。 1. 这里的打开STVD的界面。  2. 选择New Workspace建立新的工作空间(里面可以同时容纳多个工程)。  3. 选择Create workspace and project。这个选择会工作空间和项目一起建立,你也可以按需
发表于 2019-11-22
STM8S103-STVD建立汇编代码项目
LabVIEW编译程序设计知识介绍
为可以被编译程序使用的数据流中间表示(DFIR)图表。编译程序执行几种变换,例如在DFIR图表分解过程中的死码删除,优化,并为代码生成做好准备。DFIR接下来被转化成底层的虚拟机(LLVM)中间表示(IR),有关IR的一系列扫描被运行,以利于更进一步的优化与底层化——最终——变为机器码。  DFIR提供一种高级的中间表示  DFIR是一种分级的,结构图代码的,基于图表的IR。类似于G代码,DFIR包含很多具有端点的节点,能够与其它端点相连。一些节点,例如框图,含有图表,这些图表也可以依此类推地包含其它节点。  图1显示了一个简单VI的最初DFIR。当LabVIEW首次为VI创建一个DFIR时,这是一种G代码的直接翻译,DFIR图表
发表于 2019-11-20
LabVIEW编译程序设计知识介绍
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved