簡體   English   中英

“屏幕翻轉”簡單裝配程序

[英]“Screen Flip” Simple Assembly Program

所以我正在我的機器組織課程中開展我的第一個項目。 程序運行時,應該垂直翻轉屏幕。 例如,左側的所有字符和數字都將翻轉到右側,反之亦然。 為實現這一點, 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 
    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后將row與80進行比較? (你怎么能指望它為達到值80?)順便說一句,你不初始化row ,當你開始一個新行。 此外,為什么它似乎是計數列時稱為“行”?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM