所以我正在我的机器组织课程中处理我的第一个项目。程序运行时,应该垂直翻转屏幕。例如,左侧的所有字符和数字都将翻转到右侧,反之亦然。为实现此目的,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
答案 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
。另外,为什么它似乎在计算列时称为“行”?