Int 10h,AH 6h/7h的参数意味着什么?

Had*_*320 1 x86 assembly bios vga

有点愚蠢的问题,但是,任何人都可以向我解释寄存器cx和dx在Int 10h中有什么目的啊= 6/7(它们都使用相同的变量只是在不同的方向滚动).

到处都看,它只是说了类似的东西:

CH =上行号,CL =左列号,DH =下行号,DL =右列号

这对我来说并不是很重要,任何人都能以某种像我这样的哑巴能理解的方式解释这一点吗?

Mar*_*oom 9

考虑一下用文字模式绘制的红色矩形窗口的眼睛刺眼的迷幻图片:

矩形的红色窗口

每个白蓝方块代表一个字符单元格.细胞是逆右上方和上下方.顶部的数字向下读,给出距离左边缘1的单元格距离.
左边的数字给出了距离顶部的单元格距离.

对于每个单元2唯一的对(距离左侧,距离顶部的距离)称为坐标对或简称为坐标(或甚至是坐标). 这是习惯性地叫距离左为X,从车顶的距离Ÿ,一切以宽度相关的东西-X和有关的一切的高度,一些-Y .

大红色矩形是一个窗口3.
Windows有两个维度和一个位置.因此,窗口可以用三元组标识(左上角的位置坐标,大小为X,大小为Y).
例如,红色窗口可以描述为((30,8),22,7),因为它从(30,8)开始,它是22个细胞宽和7个细胞高.

描述窗口的另一种方式是使用左上角的坐标和右下角的坐标.
在这种情况下,红色窗口是((30,8),(51,14)).


该服务int 10h/AH=06h可用于移动红色窗口内容.
我们需要告诉它移动窗口的位置,因为它使用第二种表示法,所以我们这样做.

CL并且CH形成保持左上角的对,X在CL中,Y在CH中.
DLDH形成所述一对保持右下COORDS,X在DL,Y在DH.

此代码正确加载寄存器(两个版本等效)

;Easy version             ;Normal version
mov cl, 30                mov cx, 081eh
mov ch, 8                 mov dx, 0e34h
mov dl, 52
mov dh, 14
Run Code Online (Sandbox Code Playgroud)

服务例程的其他输入是微不足道的,但是BH现在我们将其设置为零.
让我们来电话:

mov ax, 0603h      ;Scroll three lines up
xor bh, bh
mov cx, 081eh
mov dx, 0e34h
int 10h
Run Code Online (Sandbox Code Playgroud)

结果是:

窗口滚动

我们可以看到窗口内容已经向上滚动了三行.
窗户外没有任何东西被触及.

我们还注意到从下面"移位"的线是黑线.
这是输入BH发挥作用的地方,它包含用于绘制这些线的属性(颜色和背景颜色的组合).

例如,属性0e0h指定亮黄色4,让我们使用它.

mov ax, 0603h      ;Scroll three lines up
mov bh, 0e0h       ;Yellow lines
mov cx, 081eh
mov dx, 0e34h
int 10h
Run Code Online (Sandbox Code Playgroud)

窗口向上滚动黄线

最后,值AL可以为零以向上滚动整个窗口,即多个行等于窗口的高度.


对于服务int 10h/AH=07h,基本原理是相同的,但窗口向下滚动.


1在细胞单位中.
2请注意,用于显示数字的单元格也具有坐标.
3因为它实际上看起来像一个窗口.
4因为我们在这种情况下设置了高强度位.

  • 很好的答案.写作必须花费相当长的时间. (2认同)