LC-3 マシンコードプログラミング実験

1. 実験の目的

  1. 実験によって指定された、解決すべき問題を分析して理解します。
  2. LC-3 のマシンコードを使用して、関連プログラムを設計および実装します。
  3. LC-3 エミュレータを通じて関連プログラムをデバッグおよび実行し、正しい結果を取得します。

2. 実験内容

LC-3の機械語コードを使用して、16ビットワード中に「1」が何ビットあるかを計算します。プログラムはx3000からスタートし、計算対象のワードがx3100に格納され、計算結果がx3101に格納されます。

3. 実験手順と結果

1. フローチャートと考え方

ここに画像の説明を挿入

入力データには 16 ビットしかないため、データ内の「1」の数を計算するのに必要なサイクルは 16 サイクルだけです。16 回のループを実現する具体的な方法は、レジスタ (R2) の値を 16 に設定し、ループの各回の終了時に 1 ずつ減算し、R2 = 0 になるまでループを停止します。このようにして、各ビットをチェックしながらループを 16 回実行できます。ここで問題があり、5 ビットの即値の範囲が制限されており、R2 の値を一度に 16 に加算することはできません。そこで、これを 2 回に分けました。シリング R2 = 1、次に R2 += 15 です。

入力データはレジスタ(R3)に保存され、サイクルごとに0以上かどうかで符号ビットを検出します。数値が負でない場合、符号ビットは 0 になり、数値が負の場合、符号ビットは 1 になります。結果を保持するレジスタ (R1) に各検出ラウンドの情報を記録します。

各サイクルの後、R3 の値を 1 ビット左にシフトします。具体的な方法は、R3の値を2倍することであり、R3=R3+R3という加算により実現されます。このようにして、最上位ビットの情報を更新し、プログラムの終了まで次の検出を行うことができる。

2. ソースコードとコメント

0011 000 000000000      ; 设置初始位置,PC = x3000

0101 001 001 1 00000    ; R1 <- 0 该寄存器用来记录1的个数
0001 010 001 1 00001    ; R2 <- 1 该寄存器用来判断循环次数
0001 010 010 1 01111    ; R2 <- R2 + 15 分两次进行赋值,共16次

0010 011 011111100		; R3 <- *(x3100) 将待测数据放进R3

						;循环
0000 011 000000001		; R3 >= 0 ? 判断R3符号位是否为0,是则跳过下一句
0001 001 001 1 00001	; R1 <- R1 + 1 更新R1的值
0001 010 010 1 11111	; R2 <- R2 - 1 
0000 010 000000010		; R2 == 0 ? 判断是否结束?如果R2为0则结束
0001 011 011 0 00011	; R3 <- R3 << 1
0000 111 111111010		; 向回跳转,循环继续

0011 001 011110110		; 将R1的结果存储至x3101

3. 実験手順と結果

まず、LC3 Edit で上記のコードを編集し、次に obj ファイルを生成します。図に示すように、エラーは見つかりませんでした。

ここに画像の説明を挿入
LC3エミュレータでロードしてください。に入力データを書き込み、 を実行します
ここに画像の説明を挿入
x3100最後にx3101結果をここで確認します。ここでは 4 セットのテスト データ テストを使用しました。

例 1: 入力 15 (x000F)

ここに画像の説明を挿入
結果は図に示されています。
ここに画像の説明を挿入
入力データの補数には 4 つの「1」があり、これは正しいことがわかります。

例 2: 入力 642 (x0282)

ここに画像の説明を挿入
結果を図に示します。

ここに画像の説明を挿入
入力データの補数には「1」が 3 つあり、これは正しいことがわかります。

例 3: 0 (x0000) を入力します。

ここに画像の説明を挿入
結果を図に示します。
ここに画像の説明を挿入

例 4: -100 を入力 (xFF9C)

ここに画像の説明を挿入
結果は図に示されています。
ここに画像の説明を挿入
入力データの補数には 12 個の「1」があり、これは依然として正しいことがわかります。

おすすめ

転載: blog.csdn.net/weixin_46655675/article/details/130858010