int 33总是显示相同的数据

时间:2019-02-13 16:21:38

标签: assembly x86 x86-16 dosbox

在我的代码上,我必须检查是否在图像上按下了鼠标。 当我调试代码时,我看到中断一遍又一遍地返回相同的信息 mikoon是图片打印的起点(16 * 16)

private static int _k = 10;
public static int k
{
    get { Console.WriteLine($"evaluating k ({_k})"); return _k; }
    set { Console.WriteLine($"{value} assigned to k"); _k = value; }
}

private static int _c = 30;
public static int c
{
    get { Console.WriteLine($"evaluating c ({_c})"); return _c; }
    set { Console.WriteLine($"{value} assigned to c"); _c = value; }
}

public static void Test()
{
    k += c += k += c;
}

1 个答案:

答案 0 :(得分:1)

只要您的 CleanScreen 过程设置视频模式AL就会包含(剩余)值16h,该值是十进制的22。没有这样的视频模式!

您没有提及它,但是我有点假设您使用的是13h(320x200)视频模式。

xor bx, bx
mov ax,05h  ; Return button press data
int 33h 
shr cx, 1

此鼠标功能在CXDX中返回 x,y坐标
您的程序甚至不使用y坐标!
减法0A000h又是什么呢?视频存储器位于段地址0A000h上,但这与该程序无关。

您需要做的是将CX与图片的左侧和右侧坐标进行比较,并将DX与图片的顶部和底部坐标进行比较。

  cmp cx, [LeftX]
  jb  outside
  cmp cx, [RightX]   ; RightX == LeftX + Width - 1
  ja  outside
  cmp dx, [TopY]
  jb  outside
  cmp dx, [BottomY]  ; BottomY == TopY + Height - 1
  ja  outside
  ;
  ; Here you're inside the picture
  ;
outside:
  ;
  ; Here you're outside the picture
  ;