1

おそらくばかげた質問ですが、これは私の Machine Organization クラスでの最初のプロジェクトであり、問​​題が発生しています。以下のコードは、画面の中央に上から下に「*」を表示するためのものです。アセンブルしないコード行は次のとおりです。
MOV ES: [ numLoops * 80 * 2 + (40 * 2) ], BYTE PTR '*'

numLoopsこれがアセンブルされない理由は理解していますが、コード行が実行されるたびnumLoopsにデクリメントされるように行を上に移動するように、その値を取得するために何を配置すればよいかわかりません。どんなアドバイスでも大歓迎です、ありがとう。

MyData SEGMENT

    numLoops DB 25

MyData ENDS     

;-------------------------------------------------------------------------------
MyCode SEGMENT

        ASSUME CS:MyCode, DS:MyData   

MainProg  PROC                

    MOV     AX, MyData             
    MOV     DS, AX                 
    MOV     AX, 0B800h         
    MOV     ES, AX

    loop25: 

      CALL displayChar

      DEC numLoops                  
      CMP numLoops, 0
    JNE loop25                ;if not equal to 0, numLoops - 1 and repeat

    MOV     AH, 4Ch                
    INT     21h                   

MainProg ENDP  

displayChar  PROC 

    MOV     ES: [ numLoops * 80 * 2 + (40 * 2)  ], BYTE PTR '*' 

    RET
displayChar ENDP                 

MyCode ENDS 
4

2 に答える 2

1

レジスタを使用して計算しますnumLoops * 80 * 2

  mov bx,[numLoops]
  imul bx,bx,160
  mov byte ptr es:[bx + 40*2],'*'  ; note that byte ptr goes before the memory
                                   ; operand, not the immediate operand.

これを行うにはもっと効率的な方法があります (たとえば、レジ​​スターの 25*160 から始めて、反復ごとにそこから 160 を引くだけです) が、機能するものだけが必要な場合はこれで十分です。

于 2015-02-26T17:56:55.807 に答える