0

我们应该将上半部分与下半部分交换,我的代码就是这样做的,但问题是最后一行应该是“C:>FILE_NAME”。但是该行中的 C 位于倒数第二个。它也缺少一行。我一直在尝试使用 CX 中的数字,但我一无所获。这是代码:

;Swap two halves of the screen crosswise

JMP START   ;This will start the program

START:
    MOV AX, 0B800H
    MOV ES, AX       ;Assign Video Display Area to ES
    MOV DS, AX      ;Assign Video Display Area to DS
    MOV SI, 0
    MOV DI, (80*2)*(12)  ;Lower half of screen

MOV CX, 13      ;Loop for half of screen

OUTERLOOP:
    PUSH CX
    MOV CX, 80  ;COLUMNS. I GET IT NOW!

INNERLOOP:
    MOV AL, [DS:SI]
    MOV B[ES:DI], AL
    ADD DI, 2

   MOV BL, [ES:DI]
   MOV B[ES:SI], BL
   ADD SI, 2 

LOOP INNERLOOP

   POP CX        

LOOP OUTERLOOP

INT 20H
4

1 回答 1

0

你的内部循环做错了交换。第一个块将一个字符从c上半部分的列复制到下半部分,然后第二个块将字符从c+1底部的列复制到c顶部的列。要交换,您应该从两半读取同一列并将它们交换后写回。如:

MOV AL, [SI]
MOV BL, [DI]
MOV [SI], BL
MOV [DI], AL
ADD DI, 2
ADD SI, 2 

此外,它只复制一个字节,即它不复制属性(颜色)。我不知道这是不是故意的。您可以更改为 16 位寄存器AXBX然后它也会复制属性。

所有的段覆盖都是不必要的,你只需要复制 12 行,所以设置CX为 12。

于 2014-11-17T14:13:58.480 回答