CoffeeCat's IT Blog

汇编语言入门示例程序

    由于学校安排了"微机接口技术"这门课,而且实验需要用汇编来编写,没办法,只好简单学了学汇编。我发现汇编的入门有点难度,主要是因为我们的教科书(周明德主编《微机原理与接口技术》)的示例程序很多都是错误的,不知道是作者写错了,还是出版社(人民邮电出版社)的不负责任,因此增加了我们实现程序的难度。原因二是汇编的网上资料都比较乱,没有很好的源代码,而且汇编种类很多,所以很难找到合适的资料。

    综合以上原因,我写了一个比较完整的简单示例程序,提供给初学者入门。该程序的功能很简单,是打印指定字符串,并求出字符串的个数并打印出来。

    该程序包含了简单汇编程序的核心内容,包括了段的写法,过程的写法和调用,以及栈段的简单用法,同时,也有如何输出单个字符,如何输出字符串,如何打印数字,如何让程序等待运行(即C语言的getchar()),我觉得对汇编入门很有帮助,与大家分享。


文件:str.asm
DATA    SEGMENT
MSG0    DB    
'=========================字符串的长度与显示========================','$'
MSG1    DB    
'        字符串为 ','$'
MSG2    DB    
'        字符串长度为 ','$'
MSG3    DB    
'=============================CoffeeCat============================','$'
STRING    DB    
'ABCDEFGHNIASDNFKNSADKLFASDFKLNASDKF','$'
CR    EQU    
'$'
COUNT    DB    
?
DATA    ENDS

STACK    SEGMENT    PARA    STACK    
'STACK'
    STAPN    DB    
100 DUP (?)
STACK    ENDS

CODE    SEGMENT
    ASSUME    CS:CODE,DS:DATA,SS:STACK

START:
    MOV    AX,DATA
    MOV    DS,AX
    MOV    AX,STACK
    MOV    SS,AX
    
    LEA    DX,MSG0
    CALL    PRINTS
    
    CALL    ENTER
    CALL    ENTER
    CALL    ENTER


    LEA    DX,MSG1
    CALL    PRINTS
    LEA    DX,STRING
    CALL    PRINTS
    CALL    ENTER

    LEA    DX,MSG2
    CALL    PRINTS

    LEA    DI, STRING 


    MOV    AL,[DI]
    MOV    BL,CR
    MOV    DL,
0
    
    AGAIN:    CMP    AL,BL
        JE    NEXT

        INC    DL
        
        INC    DI
        MOV    AL,[DI]
        JMP    AGAIN
    
    NEXT:
        CALL    TOSTR
        

    CALL    ENTER
    CALL    ENTER
    CALL    ENTER
    LEA    DX,MSG3
    CALL    PRINTS



    CALL    STAND

    CALL    QUIT



PRINTC    PROC    NEAR    ;打印字符
    MOV    AH,02H
    INT    21H
    RET
PRINTC    ENDP

PRINTS    PROC    NEAR;打印字符串
    MOV    AH,09H
    INT    21H
    RET
PRINTS    ENDP

ENTER    PROC    NEAR;显示回车换行
    MOV    DL,0DH ;输出回车控制符cr
    CALL    PRINTC
    MOV    DL,0AH ;输出换行控制符lf
    CALL    PRINTC
    RET
ENTER    ENDP

STAND    PROC    NEAR;程序暂停,等待输入
    MOV    AH,01H
    INT    21H
    RET
STAND    ENDP

TOSTR    PROC    NEAR;将DL中的数值打印出来
    MOV    CL,
10
    MOV    AX,
0
    MOV    COUNT,
0
    MOV    BL,DL
    AGAIN2:
        MOV    AX,
0
        MOV    AL,BL
        DIV    CL
        MOV    BL,AL
        MOV    DL,AH    ;取出余数并打印
        ADD    DL,
'0'
        INC    COUNT    ;计数器
+1,用于保存DL的位数

        

        ;压入栈
        MOV    AH,
0
        MOV    AL,DL
        PUSH    AX
        
        CMP    BL,
0
        JNZ    AGAIN2

    AGAIN3:
        CMP    COUNT,
0
        JE    DONE

        POP    AX
        MOV    DL,AL
        CALL    PRINTC
        
        DEC    COUNT
        JMP    AGAIN3


        
    DONE:
        RET
TOSTR    ENDP

QUIT    PROC    NEAR    ;程序结束
    MOV    AH,4CH
    INT    21H
    RET
QUIT    ENDP

MOV    AH,4CH
INT    21H
        
CODE    ENDS

END    START



程序简单说明:

    该程序首先定义了数据段data,其次是栈段stack,最后是代码段code。

    该程序包含了6个子过程,如下所示。而在start里,主要通过CALL来调用子程序完成相应的功能。

        PRINTC    打印单个字符
        PRINTS    打印字符串
        ENTER     输出回车换行
        STAND     等待输入,也就是让程序暂停
        TOSTR     将数字打印出来
        QUIT      退出程序



运行方法:

    打开cmd窗口,用cd命令切换到str.asm文件所在目录,然后输入命令

    masm str.asm

    link str.asm

    str.exe



当然,环境变量path必须加上masm的所在的路径,比如,你的masm安装的路径是c:\masm,则你需要设置你的环境变量path,在原来的内容后加上;c:\masm即可,否则,masm命令将不可用



CoffeeCat
2007-04-17

posted on 2007-04-17 16:26 CoffeeCat 阅读(6973) 评论(4)  编辑 收藏 引用

评论

# re: 汇编语言入门示例程序 2008-07-04 00:55 agan

其实汇编很简单的,我现在准备出一个系列的汇编入门教程希望可以对大家有用,你可以来这里看看..多提点意见啊,让我做的更好
http://aganhome.blogspot.com/2008/07/2.html   回复  更多评论   

# re: 汇编语言入门示例程序 2008-07-04 12:17 CoffeeCat

好的,关注中,谢谢  回复  更多评论   

# re: 汇编语言入门示例程序 2009-11-19 10:59

@agan
不能显示啊  回复  更多评论   

# re: 汇编语言入门示例程序 2016-07-09 16:37 asdasd

<script>alert("!"):</script>  回复  更多评论   

只有注册用户登录后才能发表评论。
<2016年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

公告

常用链接

留言簿(182)

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜