“屏幕翻转”简单装配程序

时间:2015-02-26 20:46:50

标签: assembly dosbox

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

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 

1 个答案:

答案 0 :(得分: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进行比较? (您希望它如何达到80的值?)顺便提一下,当您开始新行时,不会初始化row。另外,为什么它似乎在计算列时称为“行”?