由于学校安排了"微机接口技术"这门课,而且实验需要用汇编来编写,没办法,只好简单学了学汇编。我发现汇编的入门有点难度,主要是因为我们的教科书(周明德主编《微机原理与接口技术》)的示例程序很多都是错误的,不知道是作者写错了,还是出版社(人民邮电出版社)的不负责任,因此增加了我们实现程序的难度。原因二是汇编的网上资料都比较乱,没有很好的源代码,而且汇编种类很多,所以很难找到合适的资料。
综合以上原因,我写了一个比较完整的简单示例程序,提供给初学者入门。该程序的功能很简单,是打印指定字符串,并求出字符串的个数并打印出来。
该程序包含了简单汇编程序的核心内容,包括了段的写法,过程的写法和调用,以及栈段的简单用法,同时,也有如何输出单个字符,如何输出字符串,如何打印数字,如何让程序等待运行(即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