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

时间:2016-06-27 12:32:26

标签: assembly x86 bios vga

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

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

  

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

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

2 个答案:

答案 0 :(得分:8)

考虑一下眼睛刺眼的迷幻画面,画着一个红色的长方形窗户。文字模式:

Rectangular red window

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

对于 2 ,每个单元 2 唯一(距离左边,距离顶部的距离),或者简称为坐标对 坐标(甚至坐标) 习惯上将左边的距离称为 X ,将距离顶部的距离称为 Y ,将与宽度相关的所有内容称为 something-X 以及与高度相关的所有内容 something-Y

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

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

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

CLCH形成一对持有左上角坐标,X位于 CL ,Y位于 CH DLDH形成一对持有右下角坐标,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

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

mov ax, 0603h      ;Scroll three lines up
xor bh, bh
mov cx, 081eh
mov dx, 0e34h
int 10h

结果是:

Window scrolled

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

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

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

mov ax, 0603h      ;Scroll three lines up
mov bh, 0e0h       ;Yellow lines
mov cx, 081eh
mov dx, 0e34h
int 10h

Window scrolled up with yellow lines

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

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

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

答案 1 :(得分:1)

16位寄存器CX可分为两个8位半,分别称为CL和CH。 CL是低8位(将助记符视为CL ow ),而CH是高8位(CH igh )。
DX寄存器也是如此:低8位在DL中,高8位在DH中。

实际上,x86的所有4个主要通用寄存器-EAX,EDX,ECX和EBX都有8位和16位重叠别名:

------------------------------------
|               EAX                |    (32 bits)
-----------------------------------
                 |       AX        |    (16 bits)
                 -------------------
                 |   AH   |   AL   |    (8 bits)
                 -------------------

因此,int 10h函数的文档告诉您CX(CL)的低8位包含窗口的最左列,而CX(CH)的高8位包含最顶层的列一排窗口。 DX(DL)的低8位包含窗口的最右侧列,而DX(DH)的高8位包含窗口的最底部行。

换句话说,您传递的是描述矩形的函数值,包括左,上,右和下界限。 CX包含两个指定窗口左上角坐标的8位值,而DX包含两个指定窗口右下角坐标的8位值。

(当我说"窗口"在这里,我的意思是"屏幕上的矩形区域要滚动"。)