汇编(三)

  本次程序实现的内容:从键盘读取一个1-7的数字,并显示相应的星期的英文单词。

  该程序使用地址表实现。用七个处理程序段分别显示1~7个 对应的英文单词,并将首地址保存在地址表中。

  地址表:在数据段中定义一个子存储区table,顺序存放7个处理程序段的起始地址。然后将输入的数字和对应的地址表下标对齐起来(即映射函数)即可。在这里需要注意的是,地址表中保存的分支地址是16位的,占用的是两个字节。所以在下标对应的时候,需要乘二。比如下标为i,则调用第i个处理程序段的入口地址是table[i*2]。乘二在汇编中可以用左移一位实现。

  具体如下:

  

;从键盘读取一个1-7的数字,并显示相应的星期的英文单词
stack segment stack
    db 2014 dup(?)
stack ends

data segment 'data'
    msg0 db 0dh,0ah,'input number(1-7):',0dh,0ah,'$'
    msg1 db 0dh,0ah,'Monday',0dh,0ah,'$'
    msg2 db 0dh,0ah,'Tuesday',0dh,0ah,'$'
    msg3 db 0dh,0ah,'Wednesday',0dh,0ah,'$'
    msg4 db 0dh,0ah,'Thursday',0dh,0ah,'$'
    msg5 db 0dh,0ah,'Friday',0dh,0ah,'$'
    msg6 db 0dh,0ah,'Saturday',0dh,0ah,'$'
    msg7 db 0dh,0ah,'Sunday',0dh,0ah,'$'
    tab dw PROCA,PROCB,PROCC,PROCD,PROCE,PROCF,PROCG  ;地址表
data ends

code segment 'code'
    assume cs:code,ds:data,ss:stack
start:
    mov ax,data
    mov ds,ax
    mov dx,offset msg0
    mov ah,09H
    int 21H
    mov ah,01H
    int 21H
    cmp al,31H
    jl start
    cmp al,37H
    jg start
    dec al
    sub al,30H
    cbw
    shl ax,1
    mov bx,ax
    jmp tab[bx]
PROCA:
    mov dx,offset msg1
    mov ah,09H
    int 21h
    jmp done
PROCB:
    mov dx,offset msg2
    mov ah,09H
    int 21h
    jmp done
PROCC:
    mov dx,offset msg3
    mov ah,09H
    int 21h
    jmp done
PROCD:
    mov dx,offset msg4
    mov ah,09H
    int 21h
    jmp done
PROCE:
    mov dx,offset msg5
    mov ah,09H
    int 21h
    jmp done
PROCF:
    mov dx,offset msg6
    mov ah,09H
    int 21h
    jmp done
PROCG:
    mov dx,offset msg7
    mov ah,09H
    int 21h
    jmp done
done:    
    mov ax,4c00h
    int 21h
code    ends
    end start

 

posted @ 2015-10-29 11:05  Num.Zero  阅读(378)  评论(0编辑  收藏  举报