AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > 汇编语言

HELLO WORLD进阶汇编程序系列

51自学网 http://www.51zixue.net
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

 

 

 
上一篇:TASM V5.0安装及注意事项  下一篇:汇编语言超浓缩教程