ソースアセンブラ一般的なコマンドの解釈+

コンセプトは精緻:

範囲

セクション名属性1、属性2

- CODE属性:デフォルトを定義するためのコードセグメントはREADONLYです。

- DATA属性:、デフォルトはREADWRITEセグメントを定義するためのデータです。

- READONLY属性:指定段落は読み取り専用で、コードセグメントのデフォルトREADONLY。

- READWRITEプロパティ:このセクションで指定読み書き可能な、デフォルトの属性データセグメントはREADWRITEです。

- ALIGN属性:ALIGN式を使用します。デフォルトでは、ELF(実行可能ファイルとリンクファイル)コードとデータセグメントは、0から式31、対応する2表現力のアラインメントの範囲で、ワード境界で整列されています。

- 共通属性:この属性は共通セグメントを定義し、これは、任意のユーザ・コードとデータを含んでいません。COMMONセクション同じセグメント共有記憶部内の同じ名前を持つ各ソースファイル

エントリ

ENTRYディレクティブは、エントリ・ポイント・アセンブラを指定するために使用されます。完全なアセンブリプログラムでは少なくとも一つのエントリを持っている必要がありますが、ソースファイルに(あなたは、複数を持つことができ、複数のENTRY、リンカによって指定された実際のエントリポイントがある場合)(ENTRYまで可能)することはできません。

インポート

識別子は、関数が外部で定義されたベースモジュールと呼ばれていることを示し

書き出す

この識別子は、外部モジュールとして使用することができるシンボルタイミングモジュールを表します

EQU

EQU命令はレジスタ指定されたシンボル名の番号または名前を割り当てるために使用されます。

使用方法:①シンボル名EQU式

②シンボル名EQUレジスタ名

MOV

ソース、ソース一定の値にターゲットにソースオペランドの値をコピーします。

使用法:MOVターゲット、ソース

追加

オペランド後に元のオペランドに追加

使用法:ADD REG / MEM REG / MEM / IMM

サブ

フロントの背面の数を減算、レジスタの前面を維持します

使用方法:SUB REG / MEM REG / MEM / IMM

LDR(指令

これ以上8以下の即時MOV命令に対応する同様の機能を有するMOVは、等号を使用することなく、実行されます。

実施例1:LDR r0は、// 0x12345678の0x12345678のはR0に格納され、このアドレスの値です。楽章だけのレジスタ、またはレジスタにすぐに移動する多数の間でデータを移動することができ、このライブ、MOVを行うことはできません。
二つの場合:LDR R0、R1 //はのr0にレジスタR1の値を表す
3の実施形態:LDR R0、[R1] // [R1]は、 メモリアドレスに対応する値r1を表し、それはの場合数R1であります住所、R0にこのアドレスの値として、

LDR(ディレクティブ

これ以上8以下の即時MOV命令の実行、等号の使用に対応する同様の機能を有するMOV、

実施例1(即時):LDR R0、= // 0x12345678の0x12345678のR0に書き込まれたアドレスへ

実施例2(参考):R0を指定されたアドレスに割り当てられたLDR R0、= _start //ラベル

DCD

データ定義(データ定義)ディレクティブ

メモリセルの初期化の完了が割り当てられている間、一般的に、特定のデータ分布記憶部に使用されます。

使用法:ラベルDCD(またはDCDU)の発現

CMP

動作のデスティネーション・オペランドからソースオペランドを減算(比較)命令暗黙減算

用途:CMP先、ソース

2つの符号なし数値を比較した場合、関係は、二つのオペランドの間に示されている右側のテーブルにフラグとキャリーフラグをゼロ表します。

CMP結果 ZF CF
客観番号<ソースオペランド 0 1
デスティネーションオペランド>ソースオペランド 0 0
デスティネーションオペランドソースオペランド= 1 0

比較は、二つの符号付き数字、記号フラグ、オーバーフローフラグゼロフラグ二つ手術台、右表されるビットの数との関係ということである場合:

CMP結果
客観番号<ソースオペランド SF≠OF
デスティネーションオペランド>ソースオペランド SFがOF =
デスティネーションオペランドソースオペランド= ZF = 1

例1:

MOV斧、5
CMP斧、10; ZF = 0とCF = 1

例2:

MOV斧、1000年
のMOV CX、1000年
のCMP CX、斧; ZF = 1、CF = 0

例3:

MOVのSI、105
CMPのSI、0; ZF = 0とCF = 0

B、BL

ジャンプ。サブルーチンCを呼び出し、最後にMOV PC、LR BLへのジャンプにラベルを追加するBL相当するものは次の命令に戻ることができます。

BGE

GEは、より大きな意味を、命令の条件であるか等しい、より大きい、または等しく、ほとんどZD思わすべての命令に追加することができます。
BGEは、バックBブランチのジャンプ手段であり、BGEは、より大きな答えであるか、単にジャンプに等しいです。

BEF

BEQ R0 = R1、BEQ命令が実行された場合BEQ命令は、CMP R0、R1などの比較命令を有していなければならない前に、そうでなければ実行されない、(EQが等しい、等しい比較)。

Bhne

BNE:ジャンプ命令データ、Zフラグがゼロに等しくないフラグレジスタ、BNE後にラベルへのジャンプ。

Bの差:BNE命令、すなわち、条件付きジャンプである:「等しくない(またはゼロ)ジャンプ命令。」ない0が指定されたアドレスに戻ってジャンプする場合は、続けています。

Bは、最も単純なブランチです。コマンドのBイベントは、ARMプロセッサはすぐにそこから継続して、与えられたアドレスにジャンプします。

BGEの差:ステータスレジスタを表示するBNE命令、それは指定された場所へのジャンプである場合= 1 Zが指定された位置、BEQとBNE反対の機能、Z == 1にジャンプ!

BX

分岐と命令セット。

MOV PC、LRと同等のBX LR効果

あなたは、サブルーチンのリターンを完了するために、MOV PC、LRまたはBX LRを使用することができます。さらに、LRは、サブルーチンの入り口で、次の命令を使用してスタックに退避することができます

LR

(サブルーチンのリターンアドレスを格納するために使用される)、リンクレジスタLRポインタ変数、メモリ内の命令アドレスに対応します。サブルーチン、その後はサブルーチンを呼び出す場合は、サブルーチンの戻りアドレスに呼び出しを返す前に、スタックに格納されます。

Nは符号付き2の補数演算の数が行われたときに、N = 1つのに示す演算の結果が負であり、n = 0が演算の結果がゼロで正であるかを示している。
Zは、 Z = 1は、計算の結果がゼロで表し、 Z = 0は非ゼロの結果が動作を示しています。
Cは:設定値C 4つの方法を有することができる
(CMNを含む)を添加する:ビット(符号なしオーバフロー)に計算結果を、C = 1、そうでなければC = 0。
(CMPを含む)を減算:操作はボロービット(符号なしオーバーフロー)が発生し、C = 0、またはC = 1。
最後の非加算/減算命令の場合、Cは、シフト操作に含まれる値のうちです。
他の非加算/減算操作コマンドのため、Cの値は、通常は不変です。
Vが設定値V 2の方法有していてもよい:
加算または減算命令のオペランドと結果が署名され、V = 1オーバーフロー符号がバイナリ補数コード表現ビットを示し
、他の非プラス/マイナス運転指令値Vは、通常は変更されません。

DCD

連続する単語記憶手段を分配し、指定されたデータを初期化します。

それに対抗する方法のいくつかの概念を理解する - 彼ら

ソース解釈:

プログラムは〜何それの機能を実現しますか?

;routine for find max value in a integer array.
;R1 is the counter of the loop.
;R2 is the pointer of the arraye element. R3 is the value of array element pointed by R2.
;R4 is alway pointing to the max element finded up now,and R5 is the value of the array element pointed by R4.
;在整数数组中查找最大值的例程。
;R1是循环的计数器。
;R2是arraye元素的指针。R3是R2指向的数组元素的值。
;R4总是指向现在找到的max元素,R5是R4指向的数组元素的值。
N EQU 10	;讲N的值定义为10
    AREA findEX01,CODE,READONLY 
    ;这是段名为findEX01(findEX01),可读可写(READONLY)的代码段(CODE)
    ENTRY	;程序开始
    EXPORT findnum	;findnum代码块可以在外部模块使用
findnum		;函数名,该函数用于初始化寄存器R1~R5的值
    MOV R1,#N-1		;将N-1的值存放到寄存器R1中
    LDR R2,=finddata10		;将finddata10的首地址存到R2中
    LDR R3,[R2]		;将R2的地址存到R3中,finddata10第一个元素的值为0x70,R3将存储0x70
    MOV R4,R2		;将R2的值存放到R4中
    MOV R5,R3		;将R3的值存放到R5中,这两步是为了从首地址开始遍历嘛
findloop02		;函数名,该函数内前半部分用于R2指针遍历数组中的连续单元,中间部分用于比较找出最大值,如果R2指向的值比R5大,将该值的地址存在R4中,该值存在R5中。
    ADD R2,R2,#4	;将R2中的值与4相加存到R2中:储存一个数需要4字节,因此指向下一个数需要偏移4个字节
    LDR R3,[R2]		;将R2指向的元素的值存到R3中
    CMP R5,R3		;比较R5和R3的值
    BGE findskip	;当R5>R3时跳到findskip函数,R5<=R3时继续执行
    MOV R4,R2		;将R2的值存到R4中
    MOV R5,R3		;将R3的值存到R5中
findskip		;函数名,用作循环,类似于for(i=9;i>=0;i--)
    SUB R1,R1,#1	;R1自减
    CMP R1,#0		;将R1的值与R0比较
    BNE findloop02	;当R1!=0时,跳转到findloop02函数
    
    BX LR			;等同于 MOV pc,lr, 这里是完成子程序的返回
    
    AREA finddat0,DATA,READWRITE
    ;这是段名为finddat0(finddat0),可读可写(READONLY)的数据段(DATA)
finddata10 DCD 0x70,0x30,0x20,0x80,0x35,0x65,0x55,0x75,0x25,0x60
;分配一段连续的单元地址
	END				;结束模块

そう!これは、最大の要素を見つけるために、配列、配列を開くことです!より良い前の記事のいくつかよりも、夜でも興奮QAQを書いた、Diudiuの土台は壊れた睡眠睡眠の関係は非常に難しいQAQを明確にするために時間がかかりませんでした

おすすめ

転載: www.cnblogs.com/lightice/p/12657316.html