回 帖 发 新 帖 刷新版面

主题:我快崩溃了,高手来帮助我一下:

题目要求是:输入数字月份,显示对应月份的英文缩写
写得很乱,融合了其他东西
下面的程序代码,无论输入什么都显示输入错误,我是没有一点办法了,帮帮我啊

data  segment
   mon db  '  jan  feb  mar  apr  may  jun  jul  aug  sep  oct  nov  dec'
   msg1 db 'please input a string:',13,10,10,'$'
   msg2 db 'input error!try again...',13,10,10,'$'    
   buffer label byte    
   maxlen db 3
   actlen db ?
   string db 3 dup(?)
data  ends
code  segment
main  proc      far
  assume    cs:code,ds:data
start:  ;初始化程序
   push ds
   sub       ax,ax 
   push      ax
   mov       ax,data
   mov       ds,ax
shuru:  ;开始输入月份编号
   lea dx,msg1
   mov ah,09h
   int 21h
   lea dx,buffer        
   mov ah,0ah
   int 21h
   cmp actlen,0          
   jmp shurue
;判断输入是否合法
   lea di,string
   cmp actlen,2
   je da10
   mov ax,(di)
   jmp jisuan
da10:
   inc di
   mov ax,(di)
   add (ax),10
   jmp jisuan
;计算偏移地址
jisuan:
   sub cx,cx
   sub si,si
   mov cx,(ax)
xuanhuan: add si,05h
   loop xuanhuan
;输出对应月份英文缩写
   mov cx,05h
xuanhuan2: mov dl,mon[si]
   inc si
   mov ah,02h
   int 21h
   loop xuanhuan2
   ret
;输入出错时
shurue:  lea dx,msg2
   mov ah,09h
   int 21h
   ret
   jmp shuru
   ret
   main endp
   code ends
   end start

回复列表 (共1个回复)

沙发

.model small
.stack
.data
   mon db  'jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec'
   msg1 db 'please input a string:',13,10,10,'$'
   msg2 db 'input error!try again...',13,10,10,'$'
   buffer label byte
   maxlen db 3
   actlen db ?
   string db 3 dup(?)
.code
.startup
shuru:  ;开始输入月份编号
   lea dx,msg1
   mov ah,09h
   int 21h
   lea dx,buffer
   mov ah,0ah
   int 21h
   cmp actlen,0
   je shurue
;判断输入是否合法
   lea di,string
   cmp actlen,2
   je da10
   mov al,string   ;只输入一位数字
   and al,0fh    ;把ASCII码转换为对应数字
   jmp jisuan
da10:
   mov al,string
   and al,0fh    ;把十位ASCII码转换为对应数字(如12月的1字)
   mov bl,10
   mul bl
   and string[1],0fh
   add al,string[1]   ;再加上个位 (如12月的2字)

;计算偏移地址
jisuan:
   cmp al,1    ;比1小是非法月份
   jb shurue
   cmp al,12
   ja shurue   ;比12大是非法月份
   sub al,1
   shl al,1
   shl al,1    ;月份值减1再乘4对应了MON字符串中从首地址开始的字符相对位置
   xor ah,ah    ;1月份从0位置开始即JAN,...5月份从位置16开始即MAY
   lea si,mon
   add si,ax
   mov cx,3
output: mov dl,[si]   ;输出对应月份英文缩写
   mov ah,2
   int 21h
   inc si
   loop output
  .exit 0

;输入出错时
shurue:  lea dx,msg2
   mov ah,09h
   int 21h
   jmp shuru

   end
用MASM615汇编通过,正确无误!

我来回复

您尚未登录,请登录后再回复。点此登录或注册