1. カメラ
  2. カーオーディオ&エレクトロニクス
  3. ホームオーディオ
  4. パーソナルオーディオ
  5. テレビ
  6. スマートホーム
  >> 電子技術オンライン >  >> 電話 >> 会議ステーション

指定された数値の階乗をアセンブリ言語でプログラムしますか?

以下は、指定された数値の階乗を計算するアセンブリ言語 (NASM 構文) のプログラムの例です。

「」

ビット 16

;データセグメントを定義する

データセグメント

番号:DW ?;階乗を求める数値

;コードセグメントを定義する

コードセグメント

始める:

mov 斧、データ;データセグメントアドレスをDSレジスタにロードします。

mov dx、番号;番号をDXに読み込む

cmp dx、0;数値が0かどうかを確認する

ジェゼロ;その場合は、「ゼロ」ラベルにジャンプします

mov cx, 1;階乗 (CX) を 1 に初期化します。

;階乗計算ループを開始する

ループ:

イマルCX; CX に DX の現在の数値を掛けます。

株式会社DX;現在の数値をインクリメントします

cmp dx、番号; DX を元の数値と比較する

jbループ; DX がその数値より小さい場合は、ループに戻ります。

;階乗を表示する

ゼロ:

mov ああ、4Ch; AH =DOS「文字列の印刷」割り込み用の 4Ch

lea dx、str_result; 「結果」文字列のアドレスをDXにロードします。

int 21h; DOS 割り込み 21h を呼び出して文字列を表示します。

レット;オペレーティングシステムに戻る

; 「結果」文字列を定義する

str_result:DB "階乗は:$"

;プログラムの終了

終了開始

;スタックセグメントを定義する

スタックセグメント

;スタックのデータを定義する

DW0

スタックエンド

「」

プログラムの説明:

1. データセグメント:

- `num:` は、データ セグメント内の `num` と呼ばれるワード (16 ビット) 変数を定義します。この変数には、階乗を求めたい数値が格納されます。

2. コードセグメント:

- `start:` はプログラムのエントリ ポイントです。

3. 初期化:

- `mov ax, DATA`:データ セグメント アドレスを AX レジスタにロードします。

- `mov dx, num`:`num` の値を DX レジスタにロードします。

4. ゼロを確認します。

- `cmp dx, 0`:DX の値と 0 を比較します。

- `je zero`:DX が 0 に等しい場合、`zero` ラベルにジャンプします。

5.階乗計算ループ:

- `ループ`:

- `imul cx`:CX の現在の値と DX の現在の数値を乗算します。

- `inc dx`:DX の値をインクリメントします。

- `cmp dx, num`:DX を元の数値と比較します。

- `jb ループ`:DX が数値より小さい場合、`loop` ラベルに戻って計算を続行します。

6. 階乗を表示します。

- `ゼロ:` (ラベル)

- `mov ah, 4Ch`:AH を 4Ch に設定します。これは文字列を印刷するための DOS 割り込みです。

- `lea dx, str_result`:「結果」文字列のアドレスを DX にロードします。

- `int 21h`:DOS 割り込み 21h を呼び出して文字列を表示します。

7. 返却:

- `ret`:オペレーティング システムに戻ります。

8. スタックセグメント:

- スタック セグメントは 1 ダブルワード (2 バイト) のサイズで定義され、0 に初期化されます。

注:このプログラムは結果の印刷に DOS オペレーティング システムを使用するため、DOS 環境または DOS をサポートするエミュレータでのみ動作します。