AMR中巨集的使用與結構化記憶體表的建立

2021-06-01 06:45:37 字數 2773 閱讀 1594

macro

$handlerlabel handler $handlelabel

$handlerlabel

sub sp,sp,#4 ;decrement sp(to store jump address)

stmfd sp!, ;push the work register to stack(lr does't push because it return to original address)

ldr r0,=$handlelabel;load the address of handle*** to r0

ldr r0,[r0] ;load the contents(service routine start address) of handle***

str r0,[sp,#4] ;store the contents(isr) of handle*** to stack

ldmfd sp!, ;pop the work register and pc(jump to isr)

mend

這個巨集定義$handlerlabel handler$handlelabel,第乙個$handlerlabel是函式名字(或者是標號),第二個$handlelabel(注意與第乙個$handlerlabel)少了乙個r,是乙個函式入口位址。

後面的**可以證明

^  _isr_startaddress              ;_isr_startaddress=0x33ff_ff00

handlereset  #  4

handleundef #  4

這段**的意思是,由0x33ff_ff00為首位址建立乙個表,之中的^與map指令同意,map 用於定義乙個結構化的記憶體表的首位址.此時,記憶體表的位置計數器設定

為該位址值為彙編器的內建變數.^與map 同義.

其中的#號與field同意,表示占用4的位元組的資料域。

因此可以看出handlereset是乙個位址,而不是handlerreset。

macro具體使用

格式:macro  

[$標號]   巨集名    [$引數1,$引數2,$引數3  ··········]

指令序列

mend

其中標號與 引數都是可選部分,但是巨集名是必須具備的部分。   其中標號與引數都會在巨集指令被展開的時候替換為使用者定義的符號,在macro與mend 之間的指令序列稱為巨集定義體。在巨集定義體的第一行應宣告巨集的原型(包含巨集名、所需引數)

注意標號的使用方式,如果巨集體內部要使用標號,那麼在巨集宣告的時候就要使用乙個標號進行宣告,使這個標號成為乙個主標號,在巨集語句段內的其他標號都必須由這個主標號構成。並且在巨集語句段內,所有標號前加「$」號。

macro                           ;巨集定義 

call $function,$dat1,$dat2 ;巨集名稱為 call,帶 3 個引數

import $function ;宣告外部子程式

mov r0,$dat1 ;設定子程式引數,r0=$dat1

mov r1,$dat2

bl function ;呼叫子程式

mend ;巨集定義結束

call     fadd1,#3,#2          ;巨集呼叫

彙編預處理後,巨集呼叫將被展開,程式清單如下:

import    fadd1    

mov       r0,#3

mov       r1,#3

bl        fadd1

在此要注意乙個比較迷惑人的問題,就是在巨集定義時,不是一定要求先是巨集名,在帶引數(當然可以不帶引數),也可以像第乙個例項一樣,中間的handler是巨集名,其他收尾兩個是引數。

map與field的具體使用

map  expr,

其中   expr         數字表示式或程式中的標號.當指令中沒有 base_register 時,expr 即為結構化記憶體表的首位址.

base_register  乙個暫存器.當指令中包含這一項時,結構化記憶體表的首地 址為 expr 與 base_register 暫存器值的和.

偽指令應用舉例如下;

map     0x00,r9 ;定義記憶體表的首位址為 r9

timer    field  4        ;定義資料域 timer,長度為 4 位元組

attrib   field  4        ;定義資料域 attrib,長度為 4 位元組

string   field 100       ;定義資料域 string,長度為 100 位元組

adr   r9,datastart ;設定 r9 的值,即設定結構化的記憶體表位址

ldr   r0,atrrib    ;相當於 ldr,r0,[r9,#4]

map偽指令和 field 偽指令配合使用,用於定義結構化的記憶體表結構

field用於定義乙個結構化記憶體表中的資料域.#與field 同義.

偽指令格式:

field  expr

其中label 當指令中包含這一項時,label的值為當前記憶體表的位置計數 器的值,彙編編譯器處理了這條 field 偽指令後,記憶體表 計數器的值將加上 expr.

expr   表示本資料域在記憶體表中所占用的位元組數.

決策的結構化與半結構化

結構化 資料結構字段含義確定,清晰,典型的如資料庫中的表結構.半結構化 具有一定結構,但語義不夠確定,典型的如html網頁,有些欄位是確定的 title 有些不確定 table 非結構化 雜亂無章的資料,很難按照乙個概念去進行抽取,無規律性 結構化程度是指對某一決策問題的決策過程 決策環境和規律,能...

結構化的學習與分析

一 為什麼要結構化學習?沒有結構化的知識只是碎片,在腦海中只是乙個個的名詞解釋,鬆散如同砂礫。當我們要解決問題的時候,很難運用到頭腦中的知識。所以我們需要把知識串聯起來,找到他們之間的內在聯絡,構建知識網路。就如同我們學習設計模式中的介面隔離原則,只知道介面隔離原則是客戶端不應該依賴它不需要的介面。...

DB2中結構化型別和型別化表的管理

db2中結構化型別和型別化表的管理 使用結構化型別定義的表稱為型別化表,同樣使用結構化型別定義的檢視稱為型別化檢視,乙個結構化型別可以是另乙個結構化型別 超型別 的子型別,子型別可以繼承超型別的所有屬 性,並且可以增加新的屬性,乙個子型別也可以是其它結構型別的超型別,因此使用者可以執行子 型別和超型...