Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1411604
  • 博文数量: 416
  • 博客积分: 13005
  • 博客等级: 上将
  • 技术积分: 3297
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 16:26
文章分类

全部博文(416)

文章存档

2014年(1)

2013年(4)

2012年(46)

2011年(64)

2010年(12)

2009年(4)

2008年(40)

2007年(187)

2006年(58)

分类: WINDOWS

2007-10-26 20:18:14

title ***hello,world进阶程序之选择分支 by lluct***

data segment ;定义数据段
msg1 db '***welcome to my program by lluct***','$'
;定义输出的第一个字符串信息,字符串必须用db定义,$为结束标志
msg2 db '1:basic message 2:advanced message','$'
;定义输出的字符串信息:选择菜单
msg3 db 'please choose:','$'
;定义输出的字符串信息:选择前缀
msg4 db 'hello,world!^-^','$'
;定义输出的字符串信息:分支1的信息
msg5 db 'this is my first asm_86 program! @^-^@','$'
;定义输出的字符串信息:分支2的信息
errmsg db 'choose error! -_-b','$'
;定义输出的字符串信息:选择错误信息
data ends ;数据段结尾

code segment ;定义代码段
assume cs:code ;规定cs的内容
assume ds:data ;规定ds的内容

start: mov ax,data ;程序从start开始
mov ds,ax ;ds置初值,data的段地址

call enter ;调用显示回车换行子程序
lea dx,msg1 ;输出第一个字符串的偏移地址
call dispchs ;调用显示字符串子程序
call enter ;调用显示回车换行子程序
call enter ;这个...同上啊^-^

lea dx,msg2 ;输出第二个字符串的偏移地址
call dispchs ;调用显示字符串子程序

again: call enter ;定义again标号.用于选择错误循环

lea dx,msg3 ;输出第三个字符串的偏移地址
call dispchs ;调用显示字符串子程序

mov ah,01h ;调用1号功能:从键盘输入一个字符并回显
int 21h ;完成输入回显
cmp al,'1' ;输入的字符和1相比较
je basicp ;如果相等,转移到basicp标号(je=jump if equal)
cmp al,'2' ;输入的字符和2相比较 ||
je advanp ;如果相等,转移到advanp标号(je=如果相等就转移)
jmp error ;否则就无条件转移到error标号

exit: mov ah,4ch ;4c号功能调用:终止当前程序并返回调用程序
int 21h ;返回dos

basicp: call enter ;什么,还要解释啊.晕-_-!!!
lea dx,msg4 ;输出第三个字符串的偏移地址
call dispchs ;调用显示字符串子程序
call enter ;..........
jmp exit ;无条件转移到exit标号

advanp: call enter ;55555555
lea dx,msg5 ;解释了四次,应该懂了吧
call dispchs ;调用显示字符串子程序
call enter ;再问就死给你看
jmp exit ;无条件转移到exit标号

error: call enter
lea dx,errmsg ;输出选择错误信息
call dispchs ;调用显示字符串子程序
mov dl,07h ;输出ascii码的报警(响铃)控制符bel(07h)
call dispch ;调用显示单个字符子程序
call enter
jmp again

dispch proc near
;显示单个字符子程序,near说明子程序和主程序在同一个代码段中(现无主程序调用)
mov ah,02h ;2号功能调用:显示器输出字符
int 21h ;完成输出显示
ret ;返回
dispch endp ;子程序结尾

enter proc near ;显示回车换行子程序
mov dl,0dh ;输出ascii码的回车控制符cr(0dh)
call dispch ;调用显示单个字符子程序
mov dl,0ah ;输出ascii码的换行控制符lf(0ah)
call dispch ;调用显示单个字符子程序
ret ;返回
enter endp ;子程序结尾

dispchs proc near
;显示字符串子程序,near说明子程序和主程序在同一个代码段中(现无主程序调用)
mov ah,09h ;9号功能调用:显示字符串
int 21h ;完成输出显示
ret
dispchs endp

code ends ;代码段结尾
end start ;结束汇编

;把以上代码复制到记事本等文本程序中,并保存.(如helloch.asm)
;编译:masm helloch.asm
;连接:link helloch.obj
;执行:helloch.exe

======================================================

title ***hello,world进阶之字符串输入输出 by lluct***

data segment ;定义数据段
input db 100 dup(?)
;定义输入的字符串,字符串必须用db定义,长度为100个字节
msg1 db 'hello,','$'
;定义输出的前缀字符串信息,字符串必须用db定义,$为结束标志(24h)
msg2 db ',welcome to here!','$'
;定义输出的后缀字符串信息
headmsg db 'please input your name:','$'
;开始显示的字符串信息
data ends ;数据段结尾

code segment ;定义代码段
assume cs:code ;规定cs的内容
assume ds:data ;规定ds的内容

start: mov ax,data ;程序从start开始
mov ds,ax ;ds置初值,data的段地址
mov si,0 ;变址寄存器置初值0

call enter ;调用显示回车换行子程序
lea dx,headmsg ;输出开始显示的字符串的偏移地址
call dispchs ;调用显示字符串子程序
repeat: mov ah,01h
;定义repeat标号,用于循环输入单个字符.调用1号功能:从键盘输入一个字符并回显
int 21h ;完成输入回显
cmp al,0dh ;输入的字符和cr(回车)比较
je exit ;如果等于回车就转移到exit
mov input[si],al ;把al的值传送到input的si地址中(好像是这样吧)
inc si ;si加1
jmp repeat ;无条件转移到repeat

exit: call enter
mov input[si],24h ;给输入完成的字符串加上结束标志($)
call enter
lea dx,msg1 ;输出前缀字符串的偏移地址
call dispchs ;调用显示字符串子程序
lea dx,input ;输出刚才输入的字符串
call dispchs
lea dx,msg2
call dispchs
call enter

mov ah,4ch ;4c号功能调用:终止当前程序并返回调用程序
int 21h ;返回dos

enter proc near ;显示回车换行子程序
mov dl,0dh ;输出ascii码的回车控制符cr(0dh)
call dispch
mov dl,0ah ;输出ascii码的换行控制符lf(0ah)
call dispch
ret ;返回
enter endp ;子程序结束

dispch proc near
mov ah,02h ;2号功能调用:显示器输出字符
int 21h ;完成输出显示
ret ;返回
dispch endp

dispchs proc near
mov ah,09h ;9号功能调用:显示字符串
int 21h ;完成输出显示
ret ;返回
dispchs endp

code ends ;代码段结尾
end start ;结束汇编

;把以上代码复制到记事本等文本程序中,并保存.(如heinout.c)
;编译:masm heinout.asm
;连接:link heinout.obj
;执行:heinout.exe

 

阅读(851) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~