![]() |
#2
zaixuexi2011-05-08 15:45
![]() datasg segment para 'data' ;数据段头 分析完three db 3 ;变量three里放的是3 mess db 'month?',13,10,'$' ;要显示出来的字符串 monin label byte ;标号名字叫monin max db 3 ;最大输入长度 act db ? ;实际长度 mon db 3 dup(?) ;用户输入缓冲区 ; ;一个占一行的分号 alfmon db '???',13,10,'$' ;要显示的字符串 montab db 'JAN','FEB','MAR','APR','MAY','JUN' ;名字叫montab的变量 db 'JUL','AUG','SEP','OCT','NOV','DEC' ;一个存着月份字符串的缓冲区,通过索引来查找 ; ;一个占一行的分号 datasg ends ;数据段尾 ;空行 codesg segment para 'code' ;代码段头 assume cs:codesg,ds:datasg,es:datasg ;段寄存器关联 main proc far ;main头 push ds ;ds入栈 sub ax,ax ;ax=0 push ax ;ax入栈,以上3句表明EXE通过PSP头的CD 20返回 ; ;一个占一行的分号 mov ax,datasg ;ax=编译器编译好的一个常量地址 mov ds,ax ;ds=ax mov es,ax ;es=ax ; Input month: ;一个被注释掉的名字叫input month的标号 ;空行 start: ;一个用做循环的标号start,所以最后一句的用法为end main,而不是end start lea dx,mess ;dx指向mess mov ah,09 ;ah=9 int 21h ;以上3句显示mess字符串 lea dx,monin ;dx指向monin mov ah,0ah ;ah=10 int 21h ;以上3句为输入月份 mov dl,13 ;dl=13 mov ah,02 ;ah=2 int 21h ;以上3句为显示一个回车符 mov dl,10 ;dl=10 mov 2h,02 ;代码哪里抄的?->mov ah,02 int 21h ;以上3句为显示一个换行符 cmp act,0 ;判断是否有输入 je exit ;没输入就退出 ;空行 mov ah,30h ;ah=30h cmp act,2 ;如果输入2位 je two ;跳转到two标号 mov al,mon ;al = mon jmp conv ;跳转到conv标号 two: ;一个名字叫two的标号 mov al,mon+1 ;al = mon+1 mov ah,mon ;以上两句为输入2位则放入ax conv: ;一个名字叫conv的标号 xor ax,3030h ;字符减掉3030h,留下正确的索引,将要保存到al中 cmp ah,0 ;如果输入1位 jz loc ;直接跳转到loc标号 sub ah,ah ;ah=0 add al,10 ;以上两句说明2位的索引,al加上10,符合montab的布局 ;空行 loc: ;一个名字叫loc的标号 lea si,montab ;si指向montab dec al ;al减1 mul three ;字节相乘,结果在ax,得到了需要的字符串在montab的偏移 add si,ax ;si指向需要输出的第1个字符 mov cx,03 ;cx=3 cld ;递增方向 lea di,alfmon ;目的缓冲区 rep movsb ;以上5句为长度为3的缓冲区数据从ds:si->es:di ;空行 lea dx,alfmon ;dx指向alfmon mov ah,09 ;ah=9 int 21h ;以上3句为显示经过修改后的alfmon字符串 jmp start ;跳转到start标号 ; ;一个占一行的分号 exit: ret ;retf跳转到psp头 main endp ;main尾 codesg ends ;代码段尾 end main ;代码段的起始地址 ![]() ![]() |
datasg segment para 'data'
three db 3
mess db 'month?',13,10,'$'
monin label byte
max db 3
act db ?
mon db 3 dup(?)
;
alfmon db '???',13,10,'$'
montab db 'JAN','FEB','MAR','APR','MAY','JUN'
db 'JUL','AUG','SEP','OCT','NOV','DEC'
;
datasg ends
codesg segment para 'code'
assume cs:codesg,ds:datasg,es:datasg
main proc far
push ds
sub ax,ax
push ax
;
mov ax,datasg
mov ds,ax
mov es,ax
; Input month:
start:
lea dx,mess
mov ah,09
int 21h
lea dx,monin
mov ah,0ah
int 21h
mov dl,13
mov ah,02
int 21h
mov dl,10
mov 2h,02
int 21h
cmp act,0
je exit
mov ah,30h
cmp act,2
je two
mov al,mon
jmp conv
two:
mov al,mon+1
mov ah,mon
conv:
xor ax,3030h
cmp ah,0
jz loc
sub ah,ah
add al,10
loc:
lea si,montab
dec al
mul three
add si,ax
mov cx,03
cld
lea di,alfmon
rep movsb
lea dx,alfmon
mov ah,09
int 21h
jmp start
;
exit: ret
main endp
codesg ends
end main