0

所以我正在我的机器组织课程中做我的第一个项目。当程序运行时,它应该垂直翻转屏幕。例如,左侧的所有字符和数字将被翻转到右侧,反之亦然。为此,loop25每行循环 25 次,每次循环向上移动一行。每个循环还调用flipRowPROC。这个过程应该取两个外部字符并交换它们,移动并重复直到它到达中心。基本上它只是不会组装。我知道问题与loopRow循环有关,但我还没有足够的经验知道如何解决它。

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

为什么要减少row两次?

 CMP row, 80
 JNE loopRow 

为什么row减量后与80进行比较?row(您如何期望它达到值 80?)顺便提一下,当您开始新行时,您不会初始化。另外,当它似乎在计算列时,为什么它被称为“行”?

于 2015-02-26T21:04:19.843 回答