0

それで、私は機械編成クラスで最初のプロジェクトに取り組んでいます。プログラムが実行されると、画面が垂直方向に反転するはずです。たとえば、左側のすべての文字と数字は右側に反転され、その逆も同様です。これを実現するには、loop25各行を 25 回ループし、ループごとに 1 行上に移動します。各ループはflipRowPROC も呼び出します。この手順は、外側の 2 つの文字を取得して交換し、移動して、中央に到達するまで繰り返すことになっています。基本的には組み立てません。問題がloopRowLOOP に関係していることはわかっていますが、修正方法を知るにはまだ十分な経験がありません。

MyData SEGMENT

    row DB 80

MyData ENDS                       

;------------------------------------------------------------------------     CODE SEGMENT
MyCode SEGMENT
        ASSUME CS:MyCode, DS:MyData   

MainProg  PROC                

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

    MOV BX, (25 * 160)


    loop25: 

      CALL flipRow

      SUB BX, 160                  
      CMP BX, 0
    JNE loop25                ;if not equal to 0, numLoops - 1 and repeat

    MOV     AH, 4Ch                
    INT     21h                   

MainProg ENDP  

flipRow  PROC 

    MOV AX, 158 

  loopRow:
    MOV DX, ES: [ (BX - 160) + ((AX - 158) * -1) ] 
    MOV CX, ES: [ (BX - 160) + AX ]
    MOV ES: [ (BX - 160) + ((AX - 158) * -1) ], CX
    MOV ES: [ (BX - 160) + AX ], DX
  DEX AX
  DEC AX
  DEC row
  DEC row
  CMP row, 80
  JNE loopRow 

    RET
flipRow ENDP                 

MyCode ENDS                       

;-------------------------------------------------------------------------------------
END MainProg 
4

1 に答える 1

0
    MOV DX, ES: [ (BX - 160) + ((AX - 158) * -1) ] 

プロセッサのアドレッシング モード機能を過大評価しているようです :p

この場合、基本的に、アドレスを (レジスターに) 計算してからロードする必要があります。アセンブリでは「(AX - 158) * -1」のような式は使用できません。個々の命令に分解する必要があります (AX から 158 を引いてから否定します)。

  DEX AX

「DEX」命令はありません。

  DEC row
  DEC row

なぜrow2回減額するのですか?

 CMP row, 80
 JNE loopRow 

rowデクリメント後に 80と比較するのはなぜですか? (どのようにして値 80 に到達すると予想しますか?) ちなみに、row新しい行を開始するときは初期化を行いません。また、列をカウントしているように見えるのに、なぜ「行」と呼ばれるのですか?

于 2015-02-26T21:04:19.843 に答える