有点愚蠢的问题,但是,任何人都可以向我解释寄存器cx和dx在Int 10h中有什么目的啊= 6/7(它们都使用相同的变量只是在不同的方向滚动)。
到处都是我看过它只是说了类似的东西:
CH =上行号,CL =左列号,DH =下行号,DL =右列号
这对我来说并不是很重要,任何人都能以某种像我这样的哑巴能够理解的方式解释这个吗?
答案 0 :(得分:8)
考虑一下眼睛刺眼的迷幻画面,画着一个红色的长方形窗户。文字模式:
每个白蓝方块代表一个字符单元格。单元格是右上方的计数器,上下。 顶部的数字向下读,给出了距离左边缘 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
可用于将红色窗口中的内容向上移动。
我们需要告诉它移动窗口的位置,因为它使用第二种表示法,所以我们这样做。
CL
和CH
形成一对持有左上角坐标,X位于 CL ,Y位于 CH 。
DL
和DH
形成一对持有右下角坐标,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
结果是:
我们可以看到窗口内的内容已经向上滚动了三行 窗户外没有任何东西被触及。
我们还注意到线条移动了#34;从下面是黑线
这是输入BH
发挥作用的地方,它包含用于绘制这些线的属性(颜色和背景颜色的组合)。
例如,属性 0e0h 指定亮黄色 4 ,让我们使用它。
mov ax, 0603h ;Scroll three lines up
mov bh, 0e0h ;Yellow lines
mov cx, 081eh
mov dx, 0e34h
int 10h
最后,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位值。
(当我说"窗口"在这里,我的意思是"屏幕上的矩形区域要滚动"。)