16位实模式,适用于DOS环境;
cpp
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, 3030h
xchg 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寄存器的值是日;
有时间继续;