指定された数値の階乗をアセンブリ言語でプログラムしますか?
「」
ビット 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 をサポートするエミュレータでのみ動作します。