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

运行MASM文件时出现语法错误,如何修复该时钟汇编程序?

修复MASM时钟程序的语法与逻辑问题

一、语法错误修复

你的代码中语法错误的核心原因是未使用分号;标注注释,MASM会把无注释符的文本当成指令解析,导致报错。需修改以下行:

  • 第61行:将xor second ,second line 61改为xor second, second ; line 61
  • 第66行:将xor minute ,minute line 66改为xor minute, minute ; line 66
  • 第71行:将xor hour ,hour line 71改为xor hour, hour ; line 71
  • 第93行:将exit: line 93改为exit: ; line 93

二、逻辑错误修复

除语法问题外,程序的时间进位逻辑、输入功能存在不符合实际使用的缺陷,建议同步修正:

1. 时间进位逻辑修正

当前代码中秒、分钟到10就进位,不符合实际时钟规则(60秒=1分钟,60分钟=1小时,12小时循环),修改如下:

inc second   ; 秒数加1
cmp second, 60  
jne display_time  

xor second, second  ; 秒归零
inc minute  
cmp minute, 60  
jne display_time  

xor minute, minute  ; 分钟归零
inc hour  
cmp hour, 13  ; 小时到13时回到1(保持1-12循环)
jne display_time

mov hour, 1  ; 重置小时为1

2. 输入功能优化

当前代码仅读取一位数字,无法输入大于9的时间(如10点、30分),可修改为读取两位数字的逻辑(以小时输入为例):

; 获取用户输入的起始时间(时,两位数字)
mov ah, 01h
int 21h
sub al, '0'
mov bl, al
mov ah, 01h
int 21h
sub al, '0'
mov ah, bl
mov cl, 10
mul cl
add al, ah
mov hour, al

三、修复后的完整代码

.model small
.stack 100h

.data
    hour db 0
    minute db 0
    second db 0

.code
main proc
    mov ax, @data
    mov ds, ax

    ; 获取用户输入的起始时间(时,两位数字)
    mov ah, 01h
    int 21h
    sub al, '0'
    mov bl, al
    mov ah, 01h
    int 21h
    sub al, '0'
    mov ah, bl
    mov cl, 10
    mul cl
    add al, ah
    mov hour, al

    ; 获取用户输入的起始时间(分,两位数字)
    mov ah, 01h
    int 21h
    sub al, '0'
    mov bl, al
    mov ah, 01h
    int 21h
    sub al, '0'
    mov ah, bl
    mov cl, 10
    mul cl
    add al, ah
    mov minute, al

    ; 获取用户输入的起始时间(秒,两位数字)
    mov ah, 01h
    int 21h
    sub al, '0'
    mov bl, al
    mov ah, 01h
    int 21h
    sub al, '0'
    mov ah, bl
    mov cl, 10
    mul cl
    add al, ah
    mov second, al

clock_loop:
    
display_time:
    call clear_screen
    
    ; 显示小时(两位数字)
    mov al, hour
    mov ah, 0
    mov bl, 10
    div bl
    mov dl, al
    add dl, '0'
    mov ah, 02h
    int 21h
    mov dl, ah
    add dl, '0'
    mov ah, 02h
    int 21h
    
    call colon
    
    ; 显示分钟(两位数字)
    mov al, minute
    mov ah, 0
    mov bl, 10
    div bl
    mov dl, al
    add dl, '0'
    mov ah, 02h
    int 21h
    mov dl, ah
    add dl, '0'
    mov ah, 02h
    int 21h
    
    call colon
    
    ; 显示秒(两位数字)
    mov al, second
    mov ah, 0
    mov bl, 10
    div bl
    mov dl, al
    add dl, '0'
    mov ah, 02h
    int 21h
    mov dl, ah
    add dl, '0'
    mov ah, 02h
    int 21h

    ; 延时(避免时钟过快)
    mov cx, 0FFFFh
delay_loop:
    dec cx
    jnz delay_loop
    
    inc second   ; 秒数加1
    cmp second, 60  
    jne display_time  

    xor second, second  ; 秒归零
    inc minute  
    cmp minute, 60  
    jne display_time  

    xor minute, minute  ; 分钟归零
    inc hour  
    cmp hour, 13  ; 小时到13时回到1
    jne display_time

    mov hour, 1  ; 小时循环为1-12
    
    jmp clock_loop

exit:  ; line 93
    mov ax, 4C00h
    int 21h

main endp

clear_screen proc
    mov ah, 06h ; 清屏功能调用
    xor al, al  ; 空白字符属性(空格)
    xor bh, bh  ; 页码(当前页为0)
    mov cx, 0   ; 屏幕左上角坐标
    mov dx, 184Fh ; 屏幕右下角坐标
    int 10h     ; 调用BIOS视频中断清屏
    ret
clear_screen endp

colon proc
    push ax
    push dx
    push bx
    push cx
    
    mov dl, ':'   ; 在屏幕上显示冒号
    mov ah, 02h
    int 21h
    
    pop cx
    pop bx
    pop dx
    pop ax
    
    ret
colon endp

end main

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:44:56