インテル8080のアセンブリを使用して形状を印刷する
-
21-12-2019 - |
質問
私の教科書からの練習として、私はインテル8080の組み立てでプログラムをコーディングしようとしています。そのようなもの、正確なこと:
*****************************
******* ******* *******
***** ***** *****
*** * *** * ***
* *** * *** *
***** *****
******* *******
*******************
(when user selects the height variable = 5)
.
と:
*****************************************
*********** *********** ***********
********* ********* *********
******* * ******* * *******
***** *** ***** *** *****
*** ***** *** ***** ***
* ******* * ******* *
********* *********
*********** ***********
****************************
(when user selects the height variable = 7)
.
アセンブリ初心者として、しかし、6つのレジスタのみを使用して、そしてまた言語自体の不親切さを念頭に置いて、このような何かの実装を想像する本当に苦労しています。私が思い付くことができる最高のものは:
最初の行は6 * height-1であることが問題ありません。問題は後で始まりますが、それは私たちが追跡しなければならないようです(私は彼らに単純さのためにいくつかの名前を与えるでしょう):
- outer_margin
- 外側の三角形の左右のスペースの数。それは各行で増加しますが、上の三角形を描いた後は機能しませんので、登録に新しい値が必要です。
- inner_spaces
- 三角形間のスペース。最初に、彼らは3,5、その後3人の三角形の底に達するまで3人になるでしょう - 問題は最初の2行の後にもっと頻繁に現れる必要があるということです。
- up_star_counter
- ライン内の上の上の三角形のそれぞれに印刷する星の追跡トラック
- down_star_counter
- 同じですが、下の行の三角形のために
- row
- 底の三角形を印刷するラベルのセットを使用し始めるときに行を知っているように、行を追跡する
- height
- ユーザーが入力したときの各三角形の高さを保持する変数
それは6つのレジスタ(そしてフリーアキュムレータ)のための6つの値を与え、楽観的ではありません。またその実施は悪夢のようです。どういうわけかタスクを簡素化するか、それが見えるのと同じくらい一生懸命になっているのでしょうか。
解決
ここで行方不明のものは、可変データを格納するためのスペースがたくさんある空きメモリがあるということです。
[BITS 16]
[ORG 0x7C00]
jmp Start
myvar dw 5
Start:
mov word bx, [myvar]
End:
jmp $
times 510-($-$$) db 0
dw 0xAA55
.
6個のレジスタはループ、カウント、ジャンプなどに使用されることを意味しています。可変のスペースを使用して、概説した変数など、膨大な量のデータを格納できます。
言語の不親切について、例をCで実施例にして、同様の組み立て符号例を作成することで、組み立てコードを骨格化しやすくします。