0

数字を入力したいプロジェクトがあり、3 を入力すると、次の出力が得られます。

ZYX**XYZ

ZY****YZ

Z******Z

そして、5はあなたを与えるでしょう

ZYXWV**VWXYZ

ZYXW****WXYZ

ZYX******XYZ

ZY********YZ

Z**********Z

私のプロジェクトでは、インストラクターが配列の使用を許可しないか、少なくともまだ許可していないと思いますが、ここに私の考えがあります。

数字の文字列を作成することを考えていたので、3 を取得するとします。ZYX* を作成し、単純に逆にして、三角形の残りの半分を取得します。ただ、文字を 1 つずつ星に変更する方法がわかりません。ループを使用してそれを行うことを考えていますが、その方法がわかりません。次の文字列が ZY** であることを知っているだけで、それを元に戻すだけです。

誤解しないでいただきたいのですが、私は皆さんに私のためにそれを行うように求めているわけではありませんが、それに取り組む方法についての指針やヒントを教えてください。ありがとうございました。

ここまで、皆様のおかげでここまでたどり着くことができました。

TITLE MASM Template                     (main.asm)

; Description:
; 
; Revision date:

INCLUDE Irvine32.inc

.data
x       DWORD   ?
msg     BYTE    "Please input a number: " ,0dh,0ah,0

.code
;crlf
main PROC
    call    Clrscr

    MOV     edx, OFFSET msg         ; Moves message to input number into register
    call    WriteString         ; Displays message on screen to prompt user to input number
    call    readInt             ; Take the number that the user inputs
    MOV     x,eax                   ; Store it into x
    MOV     ecx, eax                ; For the loop counter  
    MOV     al, 'Z'                 ; Move Z to the register

L2:
    MOV     al, 'Z'             ; Resets al to z for loop

L1:                         ; Start of the loop with label L1
    call    WriteChar           ; To write the letters
    ;call crlf              ; To put in 'enter'
    SUB     al, 1               ; To Move the next char going downward
    LOOP    L1

    MOV     al, ' '
    call    WriteChar
    MOV     ecx, x                  ; Resets ecx for outside loop
    SUB     x, 1                    ; Decrements x for counter

    call    crlf                    ; To be tidy    
    LOOP    L2

    exit
main ENDP
END main

今、私は反対側が必要です。

4

2 に答える 2

1

黒人コンピューター芸術の最凶、アセンブラーへようこそ!

この問題をアセンブラ プログラマの視点から見てみましょう。

BL としましょう (これは良いアセンブラーの名前です) という数字があり、実行したいのは BL 行の出力を生成することです。BL=5としましょう

ここで、CX はカウンター レジスタとして非常に優れているため、BL を CL にコピーし、それ自体と XOR して CH をクリアすると、CX=#lines も得られます。

反転する前に印刷する必要がある文字数は、これよりも 1 多いと都合がよいため、CX を増やすことができます。これは重要な数値なので、たとえば BP に保存します。

各行は、文字 'Z' から ('Z' - BH + 1) までの文字と 1 つのアスタリスク、その逆の同じ文字、および新しい行で構成されます。そして、新しい行ごとに、印刷される文字の数を 1 つ減らし、アスタリスクの数に 1 つ追加します。

1行を生成するには、

  • レジスターをロードします。たとえば、'Z' を使用して DL (DL は、'printme' ルーチンの出力として便利なためです)
  • それを別のレジスタ、たとえば BH にコピーします (レジスタからレジスタへの移動は、ロード即時よりも高速で小さくなります)。
  • BH から BL を引き、魔法の値 'Z' - 5 = 'U' - ベルが鳴っていますか?

文字数を出力したいので、BP を CX にコピーすると便利です。
ここでは、CX 時間でやりたいことを示します。

  • 文字を DL で書き出す - ひねりを加えて。
  • DL の文字を DECREMENTING して変更します

次に、別の BP バイトを出力する必要があるため、BP を CX に再度変換
します。

  • 文字を DL で書き出す - ひねりを加えて。
  • インクリメントして DL の文字を変更する

次に、CR と LF を送信します

それで - ひねりは何ですか?

DL の文字が BH の文字よりも小さいか等しい場合は、アスタリスクに置き換えたいので、

  • DX をスタックに保存する
  • DL<=BH の場合、DL を ASTERISK でロードします
  • 出力DL
  • DX をスタックからポップし、アスタリスクを代入する前にその値を復元します。

その行を完了 - BL の行数を減らします。結果がゼロ以外の場合、別の行を生成します

  • ゼロの場合は、すべて完了です。

ここで、BL の行数を減らすと、行生成ルーチンの開始時に DL から差し引かれる数が減るため、「アスターへの変更」値は「V」、「W」になることに注意してください。

それでは、実に変態になりましょう。

2 つの write-CX-characters ルーチンの唯一の違いは、一方が DECREMENTS で、もう一方が INCREMENTS DL であることに注意してください。

始める前に SI を 0FFFFH に、DI を 1 に設定しましょう。

現在 - DH はこのゲーム全体でベンチに座っています。

SI を DX に加算するように CX 文字を印刷するルーチンを作成するとします。これにより、最初のループで必要なデクリメントが得られます。

  • ループが終了したら、DI と SI を交換するとします。
  • 次回ループが実行されると、INCREMENT DX が実行され、SI と DI が再び交換されます。

便利ですね。

ああ、ひねりながら、DX をプッシュして戻すのではなく、DL を格納するために DH を使用することで、DH を関与させることができます。DL を DH に移動し、アスターの置換をテストし、書き出して DH から DL を復元します。

つまり、このルーチンのポイントは、ストレージ内の文字列に依存しないということです...

于 2013-04-18T15:06:01.340 に答える
0

文字のピラミッドを作成する方法に関するチュートリアルを書きました。Irvine の代わりに NASM と Windows API を使用しますが、このチュートリアルは作業を進め、ロジスティクスについて少し役立つはずです。

于 2013-04-19T03:37:48.700 に答える