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
相关产品推荐
相关产品推荐

