HELLO,WORLD进阶汇编程序系列

 
HELLO,WORLD进阶汇编程序系列
2008年03月22日 星期六 上午 11:56
Content:
TITLE    ***HELLO,WORLD进阶程序之选择分支 BY LLUCT***
DATA     SEGMENT    ;定义 <strong style="border-right: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-top: 0px; padding-bottom: 0px; margin: 0px; border-left: 0px; cursor: hand; color: #ff0000; padding-top: 0px; border-bottom: 0px; text-decoration: underline" class="kgb" οnmοuseοver="isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u6570_u636E";KeyGate_ads.ShowGgAds(this,"_u6570_u636E",event)" οnmοuseοut="isShowGg = false;InTextAds_GgLayer="_u6570_u636E"" οnclick="javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&ai=B9zh44HPkR6uMOYHs6wO_0KnBB7TgkEukjqGGB8CNtwHg1AMQBhgGIKy8kQooFDgAUJzbhbYCYJ3B4IHkBbIBDHd3dy5zeXVlLmNvbcgBAdoBLGh0dHA6Ly93d3cuc3l1ZS5jb20vUHJvY2VkdXJlL0hUTUwvODM4NC5odG1sqQJTDTA3iwaDPsgC5L6-BagDAegD2AI&num=6&adurl=http://tj.28.com/ws/edn/index.htm%3FbannerID%3D52103%26kw%3DEDN%25CD%25F8%25C2%25E7%26fz%3D767&client=ca-pub-1681215984289622");GgKwClickStat("数据","28.com","afc","2000074556");">数据 段
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值