本文主要是介绍汇编程序:简单的菜单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【任务】编制一个菜单程序,在屏幕上显示如下信息:
MENU1. FILE2. EDIT3. COMPILE4. RUN0. QUITplease choose one of 0~4:
选择1-4时,执行相应功能(简单起见,输出一句话即可),选择0时,退出程序。
【参考解答1】
assume cs:code, ss:stack
stack segmentdb 100H dup (?)
stack ends
code segmentorg 100h
start:jmp beg
menu db 10,13,10,13,' MENU 'db 10,13db 10,13,' 1. FILE'db 10,13,' 2. EDIT'db 10,13,' 3. COMPILE'db 10,13,' 4. RUN'db 10,13,' 0. QUIT'db 10,13db 10,13,' please choose one of 0~4:','$'beg:push cspop ds ;设置数据段
disp0:lea dx,menu ;DS:DX=待输出字符的地址mov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串mov ah,1int 21h ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码cmp al,'0'je exitcmp al,'1'je disp1cmp al,'2'je disp2cmp al,'3'je disp3cmp al,'4'je disp4jmp disp0
disp1:call sub1jmp disp0
disp2:call sub2jmp disp0
disp3:call sub3jmp disp0
disp4:call sub4jmp disp0exit:mov ah,4chint 21hsub1 proc nearjmp sub1_dispfile db 10,13,' --new, open, save, print files.---','$',10,13
sub1_disp:lea dx,filemov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub1 endpsub2 proc nearjmp sub2_dispedit db 10,13,' --copy, cut, paste the text.---','$',10,13
sub2_disp:lea dx,editmov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub2 endpsub3 proc nearjmp sub3_dispcompile db 10,13,' --compile the source file, then get target file.---','$',10,13
sub3_disp:lea dx,compilemov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub3 endpsub4 proc nearjmp sub4_disprun db 10,13,' --run, run, run, cannot stop.---','$',10,13
sub4_disp:lea dx,runmov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub4 endp
code endsend start
【参考解答2】使用代码的直接定址表,简单且易扩充
assume cs:code, ss:stack
stack segmentdb 100H dup (?)
stack ends
code segmentorg 100h
start:jmp beg
menu db 10,13,10,13,' MENU 'db 10,13db 10,13,' 1. FILE'db 10,13,' 2. EDIT'db 10,13,' 3. COMPILE'db 10,13,' 4. RUN'db 10,13,' 0. QUIT'db 10,13db 10,13,' please choose one of 0~4:','$'
codetab dw sub1, sub2, sub3, sub4beg:push cspop ds ;设置数据段
disp0:lea dx,menu ;DS:DX=待输出字符的地址mov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串mov ah,1int 21h ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码sub al, 30h ;ASCII变数字cmp al, 0je exitmov bl, almov bh, 0add bx, bxsub bx, 2call word ptr codetab[bx]jmp disp0exit:mov ah,4chint 21hsub1 proc nearjmp sub1_dispfile db 10,13,' --new, open, save, print files.---','$',10,13
sub1_disp:lea dx,filemov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub1 endpsub2 proc nearjmp sub2_dispedit db 10,13,' --copy, cut, paste the text.---','$',10,13
sub2_disp:lea dx,editmov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub2 endpsub3 proc nearjmp sub3_dispcompile db 10,13,' --compile the source file, then get target file.---','$',10,13
sub3_disp:lea dx,compilemov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub3 endpsub4 proc nearjmp sub4_disprun db 10,13,' --run, run, run, cannot stop.---','$',10,13
sub4_disp:lea dx,runmov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串ret
sub4 endp
code endsend start
【参考解答3】用数据的直接定址表的解法,不过,这种解法只适合选择菜单后简单提示一句话的情形,各选项功能不一样时,还是解答2更具有普遍意义。
assume cs:code, ss:stack
stack segmentdb 100H dup (?)
stack ends
code segmentorg 100h
start:jmp beg
menu db 10,13,10,13,' MENU 'db 10,13db 10,13,' 1. FILE'db 10,13,' 2. EDIT'db 10,13,' 3. COMPILE'db 10,13,' 4. RUN'db 10,13,' 0. QUIT'db 10,13db 10,13,' please choose one of 0~4:','$'
file db 10,13,' --new, open, save, print files.---',10,13,'$'
edit db 10,13,' --copy, cut, paste the text.---',10,13,'$'
compile db 10,13,' --compile the source file, then get target file.---',10,13,'$'
run db 10,13,' --run, run, run, cannot stop.---',10,13,'$'showtab dw file, edit, compile, runbeg:push cspop ds ;设置数据段
disp0:lea dx,menu ;DS:DX=待输出字符的地址mov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串mov ah,1int 21h ;调用21h中断的第1号功能,从键盘读入字符,AL保存读入字符的ASCII码sub al, 30h ;ASCII变数字cmp al, 0je exitmov bl, almov bh, 0add bx, bxsub bx, 2mov dx,word ptr showtab[bx] ;用直接定址表取得要显示字符串的地址mov ah,9int 21h ;调用21h中断的第9号功能,显示以'$'结束的字符串jmp disp0exit:mov ah,4chint 21hcode endsend start
这篇关于汇编程序:简单的菜单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!