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

8086汇编自定义样式秒表代码报错求助(WORD/BYTE小时相关错误)

8086汇编秒表代码错误分析与修正

1. "WORD Byte hour"相关错误的直接来源

你代码中hrs变量的注释存在类型矛盾:

hrs:    dw 0 ;WORD Byte

dw是定义**WORD类型(2字节)**变量的伪指令,注释里同时写WORD Byte会造成类型混淆,这就是你提到的错误的直接原因。修正方法:将注释改为清晰的类型说明:

hrs:    dw 0 ; WORD类型,存储小时数

2. 时间显示位置对齐错误

printTime函数中调整显存偏移的逻辑错误,导致时间数字与printLayout绘制的HRS、MIN等标签完全不对齐,显示混乱。

错误代码片段:

;打印小时
push word [bp+6]
add di, 2
push di
call printstr

;打印冒号
add di, 6
mov byte [es:di], ':'

修正后的printTime函数:

printTime:  push bp
mov bp,sp
pusha

        push es

        mov ax, 0xB800
        mov es, ax

        mov di, [bp+4]                  ;时间打印起始位置

        ;打印小时(对应HRS标签右侧)
        push word [bp+6]
        push di + 4                     ;HRS标签占前3个字符,小时从第2个位置开始
        call printstr

        ;打印冒号(对应布局位置)
        mov byte [es:di + 8], ':'

        ;打印分钟(对应MIN标签右侧)
        push word [bp+8]
        push di + 16                    ;MIN标签从第6位开始,分钟从第8位开始
        call printstr

        ;打印冒号
        mov byte [es:di + 20], ':'

        ;打印秒(对应S标签右侧)
        push word [bp+10]
        push di + 24                    ;S标签在第12位,秒从第13位开始
        call printstr

        ;打印冒号
        mov byte [es:di + 28], ':'

        ;打印毫秒(对应MS标签右侧)
        push word [bp+12]
        push di + 34                    ;MS标签从第17位开始,毫秒从第19位开始
        call printstr

        pop es

        popa
        pop bp
        ret 10

调用printTime时无需手动调整di,直接传递起始位置即可,保持原有参数顺序不变。

3. 计时器中断频繁刷新导致屏幕闪烁

stopWatch计时器中断处理函数中,每次中断都调用printLayout重绘标签,会造成严重的屏幕闪烁。修正方法:仅在需要更新布局的场景调用printLayout:

  • 在reset函数中添加call printLayout(重置后重绘)
  • 在左/右Shift模式切换逻辑中添加call printLayout(切换模式后重绘)
  • 移除stopWatch函数中每次中断都执行的call printLayout

4. 分段计时的连续借位逻辑缺失

原分段计时的借位处理仅考虑相邻单位,未处理跨单位连续借位(比如毫秒不够减且秒为0时,需要向分钟借位)。修正后的借位逻辑:

; 减去毫秒
l1:        sub ax, [cs:lms]
cmp ax, 0
jge l2
add ax, 1000 
dec bx
; 处理秒被减至负数的情况
cmp bx, 0
jge l2
add bx, 60
dec cx
l2:        mov [cs:lms], ax

; 减去秒
l3:        sub bx, [cs:ls]
cmp bx, 0
jge l4
add bx, 60
dec cx
; 处理分钟被减至负数的情况
cmp cx, 0
jge l4
add cx, 60
dec dx
l4:        mov [cs:ls], bx

; 减去分钟
l5:        sub cx, [cs:lmin]
cmp cx, 0
jge l6
add cx, 60
dec dx
l6:        mov [cs:lmin], cx

; 减去小时
sub dx, [cs:lhrs]
mov [cs:lhrs], dx

内容的提问来源于stack exchange,提问作者Muhammad Hasnain Arif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:31:04