谁能帮我用汇编语言写一个简单的程序

从键盘输入1,2,3,4,5,6.....12,输出相对应的月份的英文名,eg,输入5,则输出may。不想输入就输入e或者E,结束程序。
要求:输入前有提示语。若输入的是大于12或者小于0或者是字母,则输出 输入错误
最好每一行都有注释,因为这是期末大作业,老师会提问。谢谢。

data segment
  X DW ?
    f db 0    ;读取输入数字的标志符,0-正常数字,1-E or e, 2-非数字
    mo1 db 'January',0dh,0ah, '$'                   ;定义1-12月的字符串
    mo2 db 'February', 0dh, 0ah, '$'
    mo3 db 'March', 0dh, 0ah, '$'
    mo4 db 'April', 0dh,0ah,'$'
    mo5 db 'May',0dh,0ah,'$'
    mo6 db 'June',0dh,0ah,'$'
    mo7 db 'July',0dh,0ah,'$'
    mo8 db 'August',0dh,0ah,'$'
    mo9 db 'September',0dh,0ah,'$'
    mo10 db 'October',0dh,0ah,'$'
    mo11 db 'November',0dh,0ah,'$'
    mo12 db 'December',0dh,0ah,'$'
    me  db 'Input error.',0dh,0ah,'$'   ;输入错误的字符串提示
data ends

code segment
  assume cs:code, ds:data
start:
        MOV AX, data
    mov ds, ax

        lea si, X            ; si指向存储输入数字的变量
    call readint      ; 读取输入数字

f1:
    cmp f, 1 ;'E' or 'e', exit program 
    jnz f2
    jmp exit
f2:
       cmp f, 2    ;输入是不是合法数字
    jnz m1
f3:
       lea dx,me       ;不是,则输出错误信息
    jmp showmsg

m1:
    cmp X,1
        jb f3         ;输入数字<1月,则输出错误信息
    ja m2        ;x>1,判断x==2?
    lea dx,mo1       ;x==1
    jmp showmsg ;输出1月英文
m2: 
  cmp X, 2           ;判断2月?下同
    ja m3
    lea dx,mo2
    jmp showmsg
m3:
  cmp X,3
    ja m4
    lea dx,mo3
    jmp showmsg
m4:
  cmp X,4
    ja m5
    lea dx,mo4
    jmp showmsg
m5:
  cmp X,5
    ja m6
    lea dx,mo5
    jmp showmsg
m6:
  cmp X,6
    ja m7
    lea dx,mo6
    jmp showmsg
m7:
  cmp X,7
    ja m8
    lea dx,mo7
    jmp showmsg
m8:
  cmp X,8
    ja m9
    lea dx,mo8
    jmp showmsg
m9:
  cmp x, 9
    ja m10
    lea dx,mo9
    jmp showmsg
m10:
  cmp x, 10
    ja m11
    lea dx,mo10
    jmp showmsg
m11:
  cmp x,11
    ja m12
    lea dx,mo11
    jmp showmsg
m12:
        cmp x,12       ;12月?
    ja f0                ;>12,则输出错误信息
    lea dx, mo12   ;12月的提示信息
    jmp showmsg
f0:
  lea dx,me
  showmsg:
  mov ah,9  
    int 21h

exit:
        mov ah,4ch ;exit to OS
    int 21h

;read a integer less than 65535
;return it in [si]
readint proc near
  mov bx,10
read:
  mov ah,1      ;读取一个字符
    int 21h    ; 21h中断1号子功能

  cmp al,'E'  ;判断=='E'?
    jz r0
    cmp al,'e' ; =='e' ?
    jz r0
    cmp al,0dh  ;回车键,表示输入结束
    jz e2
    cmp al,'0' 
    jb e1          ; < '0',输入有误
    cmp al,'9'  ; >'9',输入有误
    ja e1

  and al,0Fh ;       ;ascII码转成实际数值
    mov ah,0
    xchg ax,[si]  ; ax与[si]互换
    mul bx          ; ax * 10
    xchg [si],ax  ; [si]与ax互换
    add [si],ax   ; [si] + ax, 即实现输入2位以上10进制数
    jmp read
r0:
        mov f, 1   ;f=1,则表示输入'E'或'e'字符
    jmp e2
e1:
  mov f, 2   ;f=2,表示输入错误字符
e2:
  ret
readint endp

code ends
end start

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-06-12
;在屏幕上输出“Hello World!”,最简代码如下:
C_S  SEGMENT
     ASSUME  CS: C_S, DS: C_S
S_T:
     MOV  AX, C_S
     MOV  DS, AX
     LEA  DX, P_S
     MOV  AH, 9
     INT  21H 
     MOV  AH, 4CH
     INT  21H
P_S  DB   'Hello World!', 36
C_S  ENDS
     END   S_T

相似回答