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

