[英]“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.