You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Emu8086模拟器中实现控制台文本闪烁的替代方法咨询

在Emu8086模拟器中实现文本闪烁效果

Emu8086对部分BIOS中断的支持有限,你用的int 10h的1003h功能(设置显示模式的闪烁属性)在该模拟器中未实现,所以无法生效。下面提供两种可行的替代方案:

方案1:通过交替修改字符属性模拟闪烁

核心思路是循环切换文本的显示属性(正常/闪烁),配合延时实现视觉上的闪烁效果。

示例代码

org 100h

; 先打印目标文本
mov ah, 09h
mov dx, offset msg
int 21h

blink_loop:
    ; 定位光标到文本起始位置(第0行第0列)
    mov ah, 02h
    mov bh, 0
    mov dh, 0
    mov dl, 0
    int 10h

    ; 设置正常属性:黑底白字(07h)
    mov ah, 09h
    mov al, ' '  ; 用空格覆盖原位置字符(也可替换为原字符)
    mov bh, 0
    mov bl, 07h
    mov cx, 11   ; 文本长度("Hello World"共11个字符)
    int 10h

    call delay   ; 延时一段时间

    ; 设置闪烁属性:黑底白字+闪烁(87h,属性字节最高位为1表示闪烁)
    mov ah, 09h
    mov bl, 87h
    int 10h

    call delay

    jmp blink_loop

; 延时子程序,控制闪烁速度
delay:
    mov cx, 0ffffh
delay_inner:
    dec cx
    jnz delay_inner
    ret

msg db 'Hello World$'

方案2:直接操作显存(更高效)

Emu8086的文本模式显存位于B800h段,每个字符占2字节:第1字节是ASCII码,第2字节是属性字节(最高位为闪烁控制位)。直接修改显存中的属性字节即可实现闪烁。

示例代码

org 100h

; 打印初始文本
mov ah, 09h
mov dx, offset msg
int 21h

; 切换到显存段
mov ax, 0b800h
mov es, ax

blink_loop:
    ; 设置正常属性:遍历11个字符的属性位
    mov di, 1          ; 第一个字符的属性字节偏移为1
    mov cx, 11
set_normal:
    mov byte ptr es:[di], 07h
    add di, 2          ; 跳至下一个字符的属性字节
    loop set_normal

    call delay

    ; 设置闪烁属性
    mov di, 1
    mov cx, 11
set_blink:
    mov byte ptr es:[di], 87h  ; 最高位置1,开启闪烁
    add di, 2
    loop set_blink

    call delay

    jmp blink_loop

delay:
    mov cx, 0ffffh
delay_inner:
    dec cx
    jnz delay_inner
    ret

msg db 'Hello World$'

注意事项

  • 调整延时子程序中的cx值可以控制闪烁速度,值越小闪烁越快;
  • 操作显存时要确保偏移量正确,避免覆盖屏幕上的其他内容;
  • 如果文本位于屏幕其他位置,需计算对应的显存偏移(每行80个字符,每个字符占2字节,偏移量=(行号*80 + 列号)*2 +1)。

内容的提问来源于stack exchange,提问作者Valkrypton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:54:59