汇编(三)
本次程序实现的内容:从键盘读取一个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
——来自 熊猫 [http://www.cnblogs.com/xiongmao-cpp/]