LiteOS Studio零成本學習ARM彙編 五 移花接木

2020-10-04 openHarmony

免責聲明:本文提供的所有內容僅供學習、分享與交流,不保證內容的正確性,亦不對內容可能帶來的風險擔責。如若轉載,請署名以及註明原始出處。本文僅代表個人的立場和觀點,並不代表任何公司或組織。

基於LiteOS Studio & Qemu零成本學習ARM 彙編——0x05 移花接木

下面的全部操作僅適用Window 10 64bits 環境。

前幾篇中的示例程序都存儲在Flash memory內,屬於EEPROM(Electrically Erasable Programmable read only memory,是指帶電可擦可編程只讀存儲器,是一種掉電後數據不丟失的存儲晶片),類似硬碟。變量不方便存儲在Flash內,需要存儲在RAM內,以便進行變量的修改。

Connex開發板擁有64MB的RAM,內存起始地址為0xA0000000,變量可以存儲這個內存區域。該開發板的內存映射如下圖:

Memory Map

0x01 LMA -> VMA

上電時,RAM中沒有數據可以直接可用。所有的代碼和數據在上電前存儲在Flash內存內。上電時,啟動代碼複製Flash中的數據到RAM,然後運行程序處理數據。程序.data區段有2個地址,一個是Flash中的load address(也稱為LMA,Load Memory Address),一個是RAM中的runtime address(也稱為VMA ,Virtual Memory Address)。

連結腳本裡需要指定.data區段的加載地址和運行時地址,彙編代碼需要複製.data從Flash到RAM。

0x02 指定加載地址LMA

VMA運行時地址就是標籤的地址。在之前的示例中,為.data區段指定了VMA。LMA加載地址沒有顯式指定,默認等同於運行時地址。程序直接從flash上執行時,這樣是沒有問題的。如果數據放到RAM上執行,LMA對應Flash、VMA對應RAM。看連結腳本:

SECTIONS { . = 0x00000000; .text : { * (.text); } flash_sdata = .; ❶ . = 0xA0000000; ram_sdata = .; ❷ .data : AT (flash_sdata) { * (.data); }; ram_edata = .; ❸ data_size = ram_edata - ram_sdata; ❹}

在Flash內存裡,僅挨著代碼段,放數據data段,flash_sdata表示數據段的開始地址。

數據段在RAM中的開始地址就是RAM的基地址。AT關鍵字指定Flash中數據段的地址。

❸ ❹

數據段的大小的計算,即RAM中數據段的結束地址、開始地址的差值。

0x04 賦值.data到RAM

從Flash中複製數據到RAM,需要下述信息:

Flash中的數據起始地址flash_sdata、RAM中的數據起始地址ram_sdata、.data區段的大小data_size。彙編代碼如下,注意copy操作的實現:

.dataval1: .4byte 10 @ First number 用於求和的第一個數val2: .4byte 30 @ Second number 用於求和的第二個數result: .space 4 @ 1 byte space for result 存放結果的空間 .global _start .text @;; Copy data to RAM. 複製Flash中的數據到RAM_start: ldr r0, =flash_sdata ldr r1, =ram_sdata ldr r2, =data_sizecopy: ldrb r4, [r0], #1 strb r4, [r1], #1 subs r2, r2, #1 bne copy @;; Add and store result. 計算加和 並存放結果 ldr r0, =val1 @ r0 = &val1 ldr r1, =val2 @ r1 = &val2 ldr r2, [r0] @ r2 = *r0 ldr r3, [r1] @ r3 = *r1 add r4, r2, r3 @ r4 = r2 + r3 ldr r0, =result @ r0 = &result str r4, [r0] @ *r0 = r4stop: b stop

GDB 單步調試:

https://gitee.com/huawei_liteos_studio/arm_assembly/tree/master/DataInRAM檢出示例代碼工程,使用LiteOS Studio打開工程。編譯、開始調測,我們打開build目錄下面的asm文件,並且分欄展示,F10單步調試,單步調試如之前操作。

點擊查看內存,輸入起始內存地址0xA000000,長度輸入100,可以打開查看內存窗口。

可以看到0xA0000000處的值為0x0A=10 0xA0000004處的值為0x1E=30. 從Flash處複製了數據。


查看內存


界面如下:

0x05 參考資料

http://www.bravegnu.org/gnu-eprog/data-in-ram.html

相關焦點

  • LiteOS Studio零成本學習ARM彙編 二 初識謝娘
    免責聲明:本文提供的所有內容僅供學習、分享與交流,不保證內容的正確性,亦不對內容可能帶來的風險擔責。如若轉載,請署名以及註明原始出處。本文僅代表個人的立場和觀點,並不代表任何公司或組織。本系列的其他文章 基於LiteOS Studio & Qemu零成本學習ARM 彙編——0x02 初識謝娘
  • LiteOS Studio零成本學習ARM彙編 三 再上層樓
    免責聲明:本文提供的所有內容僅供學習、分享與交流,不保證內容的正確性,亦不對內容可能帶來的風險擔責。如若轉載,請署名以及註明原始出處。本文僅代表個人的立場和觀點,並不代表任何公司或組織。本系列的其他文章 基於LiteOS Studio & Qemu零成本學習ARM 彙編
  • LiteOS Studio零成本學習ARM彙編 一 環境搭建
    免責聲明:本文提供的所有內容僅供學習、分享與交流,不保證內容的正確性,亦不對內容可能帶來的風險擔責。如若轉載,請署名以及註明原始出處。本文僅代表個人的立場和觀點,並不代表任何公司或組織。基於LiteOS Studio & Qemu零成本學習ARM 彙編——0x01 環境搭建下面的全部操作僅適用Window 10 64bits 環境。
  • 華為 HUAWEI LiteOS Studio安裝
    安裝arm-none-eabi軟體Embedded Toolchain自動下載程序來進行下載,默認下載到C:\Users\<UserName>\.huawei-liteos-studio\tools\arm-none-eabi目錄。
  • HUAWEI LiteOS Studio簡介
    更多信息可以訪問:https://liteos.gitee.io/liteos_studio/#/https://liteos.gitee.io/liteos_studio/#/
  • iOS ARM彙編
    其實都是GNU的彙編,只是架構不一樣,彙編是嚴重依賴機器的,機器架構不一樣,所以對應的彙編指令也就不一樣。所以,就不用去了解模擬器上的彙編,作用並不大。3、如何學好arm64彙編除了有arm64,還有arm32彙編,不過以後手機都是arm64構架,所以沒必要學arm32彙編。
  • 基於Android的ARM彙編語言系列之三:ARM彙編語言程序結構
    章節列表之一:ARM彙編語言開篇之二:C/C++程序生成ARM彙編程序的過程分析之三:ARM彙編語言程序結構之四:ARM處理器的尋址方式之五:ARM指令集與Thumb指令集之六:NEON指令集與VFP指令集本文引用地址:http://www.eepw.com.cn
  • 基於Android的ARM彙編語言系列之二:C/C++程序生成ARM彙編程序
    章節列表之一:ARM彙編語言開篇之二:C/C++程序生成ARM彙編程序的過程分析之三:ARM彙編語言程序結構之四:ARM處理器的尋址方式之五:ARM指令集與Thumb指令集之六:NEON指令集與VFP指令集本文引用地址:http://www.eepw.com.cn
  • 華為 HUAWEI LiteOS Studio界面介紹
    編譯器類型下拉菜單目前支持arm-none-eabiarm-none-eabi可參考安裝arm-none-eabi軟體,通過本站安裝程序下載編譯器目錄填寫arm-none-eabi-gcc.exeMakefile腳本與arm-none-eabi
  • 華為HUAWEI LiteOS Studio界面介紹
    編譯器類型下拉菜單目前支持arm-none-eabiarm-none-eabi可參考安裝arm-none-eabi軟體,通過本站安裝程序下載編譯器目錄填寫arm-none-eabi-gcc.exeMakefile腳本與arm-none-eabi
  • 嵌入式arm開發學習第三天
    arm開發學習第三天交叉編譯裸板程序:1.arm-cortex_a9-linux-gnueabi-gcc -nostdlib -c -o xxx.o xxx.c-c: 只編譯不連結-nostdlib: 不允許使用標準c庫內容2.arm-cortex_a9-linux-gnueabi-ld -nostartfiles
  • 有關arm彙編中的align
    經常會看到arm-linux彙編中有如下的指令:.arm-linu是按照2^n的方案對齊的,需要說明的是這個對齊和ld-script裡的對齊不同,不是一會事。For other systems, including the i386 using a.out format, and the arm and strongarm,it is the number of low-order zero bits the location counter must have after advancement.
  • ARM彙編語言(4) 指令、偽操作、偽指令學習
    IF,ELSE,ENDIF:根據條件將一段原始碼包括在彙編語言程序中或者將其排除在程序之外;IF logical expressioninstructions or directivesELSEinstructions or directivesENDIF
  • ARM 彙編的mov操作立即數的疑問
    因為對arm彙編有些指令還不能理解,特別是一些相似功能指令間的區別。偶然在網上搜到「faq ARM assembly」,其中描述的幾個問題還是值得好好研究一下。2. 慢慢的發現自己也不再害怕英文的文檔了,耐心看至少也能懂個大概。
  • arm彙編中的跳轉指令
    .textldrsp,=STACK_BASEldrsl,=STACK_BASE-STACK_SIZEldrpc,=entry這是一個合法的彙編文件,它把堆棧基址設為如下,給出了代碼一的反彙編代碼:讓我們在Linux環境下執行下面的命令: arm-elf-as -o demo.o demo.s arm-elf-objdump -D demo.o結果: demo.o:fileformatelf32-littlearmDisassemblyofsection.text
  • ARM彙編 MOV PC,LR
    另外注意pc,在調試的時候顯示的是當前指令地址,而用mov lr,pc的時候lr保存的是此指令向後數兩條指令的地址,大家可以試一下用mov pc,pc,結果得到的是跳轉兩條指令,這個原因是由於arm的流水線造成的,預取兩條指令的結果.
  • ARM裸機開發bootloader彙編語言
    一、彙編語言概述1、為什麼要使用彙編本文引用地址:http://www.eepw.com.cn/article/201611/318213.htm一般情況下我們不會用到彙編,但有兩種情況下,我們要用到彙編。1、啟動代碼。
  • 「正點原子FPGA連載」附錄A2 ARM彙編基礎
    由於本書著重於嵌入式Linux驅動的開發,對於彙編指令簡要介紹,滿足我們學習即可。領航者使用的是Xilinx的ZYNQ晶片,這是一款帶有雙核Cortex-A9內核的晶片,所以我們主要講的是Cortex-A的彙編指令。
  • 入門級ARM彙編指令
    無論是體系結構還是指令集,大家或多或少都應該對X86彙編有些了解,而對於嵌入式領域已被廣泛採用的ARM 處理器,了解的可能並不多。如果你有興趣從事嵌入式方面的開發,那麼了解一些RISC 體系結構和ARM彙編的知識還是有必要的。
  • 常用ARM彙編指令
    在嵌入式開發中,彙編程序常常用於非常關鍵的地方,比如系統啟動時初始化,進出中斷時的環境保護,恢復等對性能有要求的地方。operand2 第2個操作數arm的尋址方式如下:立即尋址寄存器尋址寄存器間接尋址基址加偏址尋址堆棧尋址塊拷貝尋址相對尋址這裡不作詳細描述,可以查閱相關文檔。