IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 第1个ARM裸板程序及引申(第004节_汇编与机器码)【修改机器码点亮led2] -> 正文阅读

[嵌入式]第1个ARM裸板程序及引申(第004节_汇编与机器码)【修改机器码点亮led2]

汇编代码如下,点亮 jz2440 LED1?灯?

 
 
/*
 * 点亮LED2: gpf5
 */
 
.text
.global _start
 
_start:
 
/* 配置GPF5为输出引脚
 * 把0x400写到地址0x56000050
 */
	ldr r1, =0x56000050
	ldr r0, =0x100	/* mov r0, #0x400 */
	str r0, [r1]
 
 
/* 设置GPF5输出高电平 
 * 把0写到地址0x56000054
 */
	ldr r1, =0x56000054
	ldr r0, =0	/* mov r0, #0 */
	str r0, [r1]
 
	/* 死循环  while(true) 相当于  */
halt:
	b halt
 

反汇编以后的代码:?上面代码存在伪指令?伪指令转化为在真正 汇编指令?

Makefile

all:
	arm-linux-gcc -c -o led_on.o led_on.S
	arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
	arm-linux-objcopy -O binary -S led_on.elf led_on.bin
	arm-linux-objdump -D led_on.elf  > led.on.dis   # 反汇编
clean:
	rm *.bin *.o *.elf

最终生成的:?led.on.dis

led_on.elf:     file format elf32-littlearm

Disassembly of section .text:

伪指令转化为在真正 汇编指令 

地址  机器码   汇编码   

00000000 <_start>:
   0: e59f1014  ldr r1, [pc, #20] ; 1c <halt+0x4>
   4: e3a00c01 	mov	r0, #256	; 0x100
   8: e5810000  str r0, [r1]
   c: e59f100c  ldr r1, [pc, #12] ; 20 <halt+0x8>
  10: e3a00000  mov r0, #0  ; 0x0
  14: e5810000  str r0, [r1]

00000018 <halt>:
  18: eafffffe  b 18 <halt>
  1c: 56000050  .word 0x56000050
  20: 56000054  .word 0x56000054
Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0: 00001741  andeq r1, r0, r1, asr #14
   4: 61656100  cmnvs r5, r0, lsl #2
   8: 01006962  tsteq r0, r2, ror #18
   c: 0000000d  andeq r0, r0, sp
  10: 00543405  subseq  r3, r4, r5, lsl #8
  14: 01080206  tsteq r8, r6, lsl #4 

上面代码解读 :

arm 有32个寄存器, r0-r16,?
pc ?: 程序指针 ? 当前地址 +8 ?, 为什么, pc = 当期地址+8 , 在执行0时候,已经在解析4,读取8在?
sp ?: 栈指针
lr ?: 包含返回地址, 函数执行完毕要回到原来地方,原来地方就是保持在lr里面?

解析第一条指令 : ? ?0: 00001741 ?andeq r1, r0, r1, asr #14

当前指令地址是0 , pc = ?0 + 8 + ?20 ?= ?0x1c ?去0x1c 读取该地址 写入 r1
?1c: ?56000050 ?.word 0x56000050r0

第二条: mov ?r0, #5376 ; 0x1500 ? 把 0x1500 写入 r0

第三条: ? ?e5810000 ?str r0, [r1] ?把 r0 0x1500 写入到 r1 对应内存?

第四条: ? ? ?c: ?e59f100c ?ldr r1, [pc, #12] ; 20 <halt+0x8>
? ? ?
? ? 0xc+ 8 + 20 = 0x20 ?去0x20地址读取它的值存放到56000054 ? r1=0x56000054

.....

编译器 把 伪指令转化为在真正 汇编指令?
把汇编指令转化为机器码, led.bin内部就是机器码
机器码就是可以烧写到裸机上
汇编码、C都是给程序员一样看的,机器码给机器跑的

在上面基础上要实现功能:?

练习: 在 原来编译的 led_on.S ?修改 机器码, 点亮 LED2
那么需要去修改机器码, 如何修改机器码 , 就要知道 上面的第二条 mov 指令 ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?这内部是如何转化的?
? 4: ?e3a00c15 ?mov ? 《============》 ?r0, #5376 ; 0x1500?

看芯片手册:?ARM Architecture Reference Manual?找到mov?指令

?上图解读:?

bit[23-20] 1010 表示mov指令
bit[15-12] 0000 表示r0
bit[11-0] ?表示0x100 ??
修改机器码, mov r0,#0x400 那么就可以点亮led2了

bit[11-0] 12位如何表示 0x100 研究? ?

分析 :

?0x100是不是 1循环右移 24位 ?? ?这里以32位为准,?

00000....000000000000000(23个0)1 ?右移动24位就是 ? ?00-00(23位)100000000(8个0) 23+1+8=32?

?那么我们把 :?

12位: ?高4位 ?(rotate,移位数) + ?低8位 (immed_8 立即数,循环右移动2*rotate位)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rotate = 12 ? immed_8 = ?1

-比如: 0x100 ? 立即数:? ?1100 ?00000001
?如果我们要点亮第二个LED灯:? 此时?ldr r0, =0x400?? ?/* mov r0, #0x400 */

0x400 ? ?1右移动 22位 ? ? 0000...00(21个0)10000....0(10个0)

rotate ?= 22/2=11 ?1011
immed_8 = 1 ? ? ? ?0000 0001?

修改: bit[11-0] ?其他的不变,?在LED的基础上

?修改led.bin

刷进去点亮的是led2?

资源地址:修改机器码点亮led2-资料2021-11-21.zip-Unix文档类资源-CSDN下载

? ? ? ? ? ? ??

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:30:12  更:2021-11-22 12:32:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:35:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码