【问题标题】:Change background and foreground color using x86 Assembly使用 x86 程序集更改背景和前景色
【发布时间】:2023-04-06 05:31:01
【问题描述】:

我正在尝试使用 x86 程序集更改屏幕的背景和前景色,但它不起作用:

mov ax,0
mov al,11101100b
int 10h
ret

据我所知,代码是正确的。难道我做错了什么?我之前尝试过这段代码:

mov ax, 0600h
mov bh, 11110000b
mov cx, 0000h
mov dx, 1010h
int 10h

但它在屏幕一角制作了一个白色的小矩形并覆盖了一些文本。

【问题讨论】:

  • 什么操作系统等?这是 16 位 DOS 还是什么?
  • int 10h, ah=0 用于设置视频模式。我不知道你为什么认为它设置了前景色/背景色。
  • @PaulR:我正在通过 QEMU 运行代码。
  • @interjay:我按照这里提到的方法:arbitcode.blogspot.in/2012/02/…
  • @theblixguy 您链接的页面上的示例记录得很好,并且准确地描述了每一行的作用。您在第一个示例中尝试的代码与该代码有很大不同。你确定你知道自己在做什么吗?

标签: assembly x86 dos x86-16 qemu


【解决方案1】:

您首先从ArbitCode 尝试的代码运行良好,并且记录得很好。

...矩形出现在文本顶部...

这可能是因为您没有设置正确的窗口大小。默认情况下,视频模式设置为模式 3,即 80x25。

只是为了确保自己设置:

MOV AH,00h      ; Set video mode
MOV AL,03h      ; Mode 3 (Color text)
INT 10H

我对您之前使用的代码进行了一些更改,我将尝试对其进行解释:

MOV AX, 0600h        ; AH=06(scroll up window), AL=00(entire window)
MOV BH, 00010111b    ; left nibble for background (blue), right nibble for foreground (light gray)
MOV CX, 0000h        ; CH=00(top), CL=00(left)
MOV DX, 1010h        ; DH=19(bottom), DL=50(right)
INT 10h

正如您在上面看到的,DH 和 DL 定义了右下角。我们的窗口大小是 80x25,所以我们必须将 DH 设置为 19h(十进制为 25),DL 设置为 50h(十进制为 80)。

【讨论】:

    【解决方案2】:

    这个问题相当模糊。您是否尝试用单一颜色绘制整个屏幕?

    中断 10 没有屏幕当前颜色/背景的概念。它能够输出具有提供的背景和颜色的单个字符(函数 AH=9);如果你按屏幕行和列循环使用它,你可以用一种颜色填充整个屏幕。

    为了记录,在文本模式下直接读取/写入帧缓冲区(在 0xb800:0000)比使用中断 10h 容易得多。

    【讨论】:

    • 是的!我希望整个屏幕都是蓝色的,文本是白色的。
    • 那么,用空格字符和属性字节 17H 滑动整个屏幕。需要我拼出整个循环吗?
    • 嗯,我不知道该怎么做。
    • 你确定汇编是这个项目的正确语言吗?除非绝对必须,否则不要在汇编中编码;这不是其中一种情况。还是这是课堂作业?
    • 我只想对此发表评论。这不是小学生让其他人编写代码的地方。自己研究和尝试,询问您是否需要帮助,但不要费心询问整个代码。
    猜你喜欢
    • 2013-08-30
    • 2012-01-15
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2021-08-28
    • 2015-07-18
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多