S3C2440使用bin文件机器码点灯

发布者:xrmilk最新更新时间:2022-08-05 来源: csdn关键字:S3C2440  bin文件 手机看文章 扫描二维码
随时随地手机看文章

S3C2440芯片手册导读

https://blog.csdn.net/qq_28258885/article/details/111461640

这次我们先点亮另外一个LED灯,于是先阅读芯片手册

在这里插入图片描述

这次配置LED2,

那么我们将GPFCON的[11,10]设置成01,也就是0x400

在这里插入图片描述

编程

/*

*点亮LED:GPF4

*/

.text //表明它是代码段

.global _start


_start:


/*配置GPF4为输出引脚

*把0x100写到地址0x56000050上,熄灭led

*/

ldr r1, =0x56000050  /*将这个地址存放到r1中*/

ldr r0, =0x400 /*或者使用 mov r0, #0x400  将0x400放入r0 */ 

str r0, [r1] /*将r0的值写入到r1的地址中*/


/*设置GPF4输出高电平

*把0x00写到地址0x56000054上,点亮led

*/

ldr r1, =0x56000054  /*将这个地址存放到r1中*/

ldr r0, =0 /*或者使用 mov r0, #0x100  将0放入r0 */ 

str r0, [r1] /*将r0的值写入到r1的地址中*/



halt: /*假设这个程序只有十几个字节*/

b halt /*这十几个字节后的内容是不确定的,所以要让他在这里死循环*/


就是将之前配置led灯的0x100修改成0x400

这时将这个文件交叉编译,生成bin文件就可以点亮了


arm-linux-gcc -c led2.S -o led.o

arm-linux-ld -Ttext 0 led.o -o led.elf

arm-linux-objcopy -O binary -S led.elf led.bin


bin文件机器码

本篇重点在于直接修改bin文件的机器码实现点灯

参考上一篇博文对于机器码和汇编的理解

https://blog.csdn.net/qq_28258885/article/details/111564680


下面直接去修改bin文件

在这里插入图片描述

我们知道,要点亮第二个led灯,就要把写入r1的0x100修改为0x400

那么我们如何知道0x100和0x400对应的机器码

——打开mov指令,得到它的机器码的格式


所以我们需要查看ARM架构的手册


ARM手册导读

在这里插入图片描述

搜索找到MOV对应章节

在这里插入图片描述

再回头看我们mov 0x100时候的机器码


对应二进制如下

在这里插入图片描述

前面的condition我们不用管他,从bit27开始看


bit24~bit21表示mov指令,1101

bit15~bit12表示r0

bit11~bit0表示0x100

我们要将0x100修改为0x400,就是要修改这12位shifter_operand(立即数)


立即数的表示

这12位如何表示立即数呢?

拆分为高四位,第八位


高四位——rotate

低八位——immed_8

立即数 = immed_8 循环右移(2 * rotate)位


计算修改的立即数

在这里插入图片描述

以上是0x100的立即数表示

高四位rotate = 12

低八位immed_8 = 1


即,0x100就等于1循环右移24位


1的二进制用32表示,就是31个0加一个1

0x100用32位2进制表示,23个0,一个1,8个0

1循环右移1位,就是1加后面31个0

再移23位,就是23个0,一个1,8个0,即0x100

验证了上面的公式

立即数 = immed_8 循环右移(2 * rotate)位


如何用立即数表示0x400?

在这里插入图片描述

0x400用32位2进制表示, 21个0和1和10个0

就是1循环右移22位

那么


rotate = 1

immedia_8 = 11

rotate = 1011

immedia_8 = 0000 0001

0x400的立即数是1011 0000 0001


bin文件机器码修改

在这里插入图片描述

机器码应为


e3a00b01


注意:之前的机器码bit31~bit12都不需要改动,只要改立即数shifter_operand即可

在这里插入图片描述

修改这个值即可

进入bin文件,十六进制显示

在这里插入图片描述

e3a00b01

在这里插入图片描述

修改后保存


烧写运行

将bin文件烧写进Nand Flash

拔掉eop连线,切换成Nand启动,重新上电


可以看到,现在亮的灯变成了第二个

S3C2440机器码点灯


总结

这个方法太过麻烦

无论是C还是汇编,都是给人类看的,更为方便

C/汇编通过编译器生成bin文件,才是给CPU用的

关键字:S3C2440  bin文件 引用地址:S3C2440使用bin文件机器码点灯

上一篇:C语言内部机制分析—基于S3C2440c语言点灯
下一篇:反汇编解析S3C2440汇编点灯

推荐阅读最新更新时间:2024-11-11 21:30

S3C2440读写大容量SD卡
先了解一下SD卡协议方面的东西 一、SD卡协议概要 命令(Command):在CMD线上,由主机发出 响应(Response):在CMD线上,由被寻址的卡发出。 数据(data): 在数据线上,用DAT0或DAT0~DAT3。 CRC校验响应及忙指示(The CRC status response and Busy indication)只能经过DAT0发送 二、命令格式: 高位,第48位 低位,第1位 0 1 contents CRC7 1 起始位,总为0 传输方向, 1:主机发出 0
[单片机]
uboot-2011.12移植到S3C2440(序四)—— uboot.lds分析与解析
OUTPUT_FORMAT( elf32-littlearm , elf32-littlearm , elf32-littlearm ) ;指定输出可执行文件是elf格式,32位ARM指令,小端 OUTPUT_ARCH(arm) ;指定输出可执行文件的平台为ARM ENTRY(_start) ;指定输出可执行文件的起始代码段为_start. SECTIONS { . = 0x00000000 ; 指明目标代码的起始地址从0x0位置开始, . 代表的是当前位置 . = ALIGN(4) ; 代码以4字节对齐 .text : ;指定代码段 { cpu/arm920t/start
[单片机]
S3C2440启动代码 中断分析
1.建立中断向量表 b ResetHandler;hereis the first instrument 0x00这是第一条执行的指令 b HandlerUndef ;handler for Undefined mode b HandlerSWI ;handler for SWI interrupt b HandlerPabort ;handler for PAbort b HandlerDabort ;handler for DAbort b . ;reserved b HandlerIRQ ;handler for IRQ interrupt
[单片机]
s3c2440裸机-代码重定位(1.重定位的引入,为什么要代码重定位)
1.重定位的引入(为什么要代码重定位) 我们知道s3c2440的cpu从0地址开始取指令执行,当从nor启动时,0地址对应nor,nor可以像内存一样读,但不能像内存一样写。我们能够从nor上取指令执行。 例子1:当nand启动的时候,我们nand中的前4K指令会变自动加载到sram中去,这时的0地址对应sram。 那么我们的程序如果大于4K,要从nand启动,sram只拷贝了nand中的前4K代码,那么如何解决这个问题呢? 那么就需要重定位代码到sdram中去,sdram的容量较大,又可以直接被cpu访问。 例子2:我们知道,程序含有: 代码段(.text) 数据段(.data):存放初始值不为0的全局变量/静态变量
[单片机]
<font color='red'>s3c2440</font>裸机-代码重定位(1.重定位的引入,为什么要代码重定位)
关于S3C2440时钟设置的理解
关于S3C2440时钟设置的理解 1)FLCK、HCLK和PCLK的关系 S3C2440有三个时钟FLCK、HCLK和PCLK 手册上说P7-8写到: FCLK is used by ARM920T,内核时钟,主频。 HCLK is used for AHB bus, which is used by the ARM920T, the memory controller, the interrupt controller, the LCD controller, the DMA and USB host block. 也就是总线时钟,包括USB时钟。 PCLK is used for APB bus, which is u
[单片机]
关于<font color='red'>S3C2440</font>时钟设置的理解
三星S3C2440的GPIO输出驱动led
从今天开始stm32先告一段落了,开始学习ARM920T架构三星公司的S3C2440,今天是头一天学习,感觉难度要比STM32的难度大得多,主要还是涉及到操作系统就脑袋疼,和学习51和stm32时的步骤一样,第一次都是先从IO输出学起,与stm32的IO相比,S3C2440的IO功能起码现在感觉不如stm32,和stm32一对比stm32若要驱动IO,必须先要开启对应的IO时钟,而且输出速率可为10M 3M50M,并可以配置为4种输出模式,三种输入模式,并且每个IO都能够用来产生外部中断,相比之下S3C2440的IO共130个,使用之前并不需要开启对应的IO时钟,从低功耗来说,stm32简直太强大了,而且只有24个管脚能产生外部中
[单片机]
s3c2440 ads程序移植到keil中(一) 初步完成
1 与其他工程一直一样 直接加入工程进行编译 2440init.s(8): error: A1023E: File option.inc could not be opened: 等错误 直接把option.inc Memcfg.inc 2440addr.inc 直接放在2440init.s的目录中 然后编译 当前记过错误消失 出现 .led.axf: Error: L6238E: 2440init.o(Init) contains invalid call from '~PRES8 (The user did not require code to preserve 8-byte aligment o
[单片机]
<font color='red'>s3c2440</font> ads程序移植到keil中(一) 初步完成
S3C2440 I/O口初始化设置与注意事项
1. S3C2440A has 130 multi-functional input/output port pins and there are eight ports as shown below: — Port A(GPA): 25-output port (output only) — Port B(GPB): 11-input/out port — Port C(GPC): 16-input/output port — Port D(GPD): 16-input/output port — Port E(GPE): 16-input/output port — Port F(GPF): 8-input/output po
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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