📄 按月查询并输出英文缩写.asm
字号:
;题目 按月查询并输出英文的全称
;********************************
data segment para 'data' ;定义数据段的内容
nine db 9 ;月份的英文字母的全部长度
monask db 'month?',13,10,'$' ;询问要查询的月份 0d-回车 0a-换行
monin label byte ;将monin的类型指定为字节且与max有相同的偏移量(段内)
max db 9 ;英文的全称的最大长度
act db ? ;存放数字的位数
mon db 3 dup(?) ;存放输入的数字
;
alfmon db '?????????',13,10,'$' ;
montab db 'JANAUARY ','FEBRUARY ' ;月份的英文表格
db 'MARCH ','APRIRL ','MAY '
db 'JUNE ','JULY '
db 'AVGUST ','SEPTEMBER','OCTOBER '
db 'NOVAMBER ','DECEMBER '
;
data ends ;数据段定义结束
;*******************************
conseg segment para 'code' ;定义代码段的内容
assume cs:conseg,ds:data,es:data ;代码段,数据段,附加段的装入
main proc far ;定义一个过程且将属性指定为远属性
push ds ;保护数据段
sub ax,ax ;将AX寄存器中的内容清零
push ax ;保护AX寄存器中的内容
;
mov ax,data
mov ds,ax ;把data数据段的段基值放入ds段中
mov es,ax ;把AX所装的段基值放入附加段中
;输入要查询的月份
start:
lea dx,monask ;装入monask的有效地址
mov ah,09
int 21h ;字符串显示功能 输出'month?' 然后回车.换行
lea dx,monin ;装入monin的有效地址
mov ah,0ah
int 21h
mov dl,13
mov ah,02
int 21h ;显示输出回车
mov dl,10
mov ah,02
int 21h ;显示输出换行
cmp act,0
je exit ;跳转的条件
;将ASCII码值转换为十进制数值
mov ah,30h ;建立月份
cmp act,2 ;判断是否是两位数
je ewo ;跳转到ewo
mov al,mon
jmp conv ;无条件转移到conv
ewo: mov al,mon+1 ;mon 中低位的内容给al
mov ah,mon ;mon 中高位的内容给ah
conv:xor ax,3030h ;清空ASCII码值
cmp ah,0 ;月份 01-09?
jz loc ;是的话 直接通过
sub ah,ah ;否的话 清空寄存器AH中的值
add al,10 ;修正常数值使之存在al处
;确立在所建立的月份表中的位置
loc:lea si,montab ;装入montab的有效地址
dec al ;月份数减-1 地址=montab+(月份数-1)*9
mul nine ;计算九个字符的长度
add si,ax
mov cx,09 ;重复移进的次数
cld ;将方向标志清零
lea di,alfmon ;读入alfmon的地址
rep movsb ;重复移进九个字符
;显示阿拉伯数字的月份
lea dx,alfmon ;将alfmon的有效地址装入dx中
mov ah,09
int 21h ;打印输出月份的英文全称
jmp start ;是否还有输入
exit:ret ;没有的话 跳出
main endp ;过程定义结束
conseg ends ;代码段定义结束
;*******************************
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -