16位实模式适用于DOS环境org 100h ; 显示日期 mov ah, 2Ah ; 获取系统日期 int 21h ; CX年, DH月, DL日 mov al, dl ; 日 call print_dec mov dl, / ; 分隔符 call print_char mov al, dh ; 月 call print_dec mov dl, / ; 分隔符 call print_char mov ax, cx ; 年 call print_dec ; 显示分隔空格 mov dl, call print_char ; 显示时间 mov ah, 2Ch ; 获取系统时间 int 21h ; CH时, CL分, DH秒 mov al, ch ; 时 call print_dec mov dl, : ; 分隔符 call print_char mov al, cl ; 分 call print_dec mov dl, : ; 分隔符 call print_char mov al, dh ; 秒 call print_dec mov ax, 4C00h ; 退出程序 int 21h ; 子程序打印AL中的十进制数0-99 print_dec: aam ; AL - AH(十位), AL(个位) add ax, 3030h xchg al, ah mov dl, al call print_char mov dl, ah ; 子程序打印DL中的ASCII字符 print_char: push ax mov ah, 02h int 21h pop ax ret在模拟器运行如下它有两个子过程print_char打印dl中的ascii字符print_dec打印AL中的十进制数0-99学习一下aam指令x86 AAM指令用于对AL寄存器中的非压缩BCD乘法结果进行调整以得到正确的非压缩BCD格式高位存于AH中低位存于AL中。AAM指令本身并不带操作数。在执行AAM之前通常是先执行MUL指令将两个非压缩BCD数相乘结果存于AX中实际上结果主要在AL中然后使用AAM指令将AL中的结果调整为两个非压缩BCD数字高位存于AH中低位存于AL中。为什么会有这两句add ax, 3030hxchg al, ah查到的资料说这两句汇编代码的作用是将AX寄存器中的两字节非压缩BCD码转换成可以显示的ASCII码ADD AX, 3030H将AX寄存器中的内容与3030H相加结果存入AX寄存器中。这一步骤通常用于将非压缩BCD码转换为ASCII码。XCHG AL, AH交换AX寄存器中AL和AH的内容。这一步骤用于调整字节顺序使得转换后的ASCII码正确显示。这两句代码的组合常用于将二进制无符号数转换成显式的十进制ASCII码并显示。例如如果AX中存储的是非压缩BCD码经过这两步操作后AX中的内容将变成对应的ASCII码便于在屏幕上显示。ADD AX, 3030H将非压缩BCD码转换为ASCII码。XCHG AL, AH交换字节顺序确保ASCII码正确显示。这两句代码的组合常用于将二进制无符号数转换成显式的十进制ASCII码并显示mov dl, / 这么写也是可以的没出错我汇编不是太熟悉mov ah, 2Ah ; 获取系统日期int 21h ; CX年, DH月, DL日调用中断获取系统日期把2Ah赋给ah是入参调用成功以后cx寄存器的值是年dh寄存器的值是月dl寄存器的值是日有时间继续