一个完整的汇编语言源程序在结构上必须做到以下几点:
完整段定义格式:
.586 ;方式定义
DATA SEGMENT USE16 ;定义数据段
;....
DATA ENDS
CODE SEGMENT USE16 ;定义代码段
ASSUME CS:CODE,DS:DATA ;说明段约定
BEG:MOV AX,DATA ;BEG为启动地址
MOV DS,AX
;....
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END BEG ;汇编结束
注:在汇编中,冒号后面表示注释内容。
功能:通知汇编程序,源程序经过汇编链接后生成哪一种CPU类型的机器指令;
应用:源程序第一条指令,指令以句号开头。
例如:.586
说明:不设置方式选择伪指令与设置.8086
是等价的。
格式:
段名 SEGMENT 定位参数链接参数'分类名' 段长度
段体
段名 ENDS
功能:是逻辑段的定界语句,源程序中每一个逻辑段都必须用定义语句定界。
段名:无特别限制,只是为了说明,但通常便于阅读,我们通常会把DATA作为数据段的段名,用STACK作为堆栈段的段名,CODE为代码段的段名。
格式:ASSUME 段寄存器:段名,…,段寄存器:段名
功能:ASSUME语句通知汇编程序,寻址逻辑段使用哪一个寄存器
格式1:END 程序的启动地址标号
例如:END BEGIN
功能:通知汇编程序,源程序到此结束,用BEGIN作为标号的指令是程序的启动指令。
格式2:END
功能:通知汇编程序,源程序到此结束。在模块化程序的子模块中,必须用次格式作为源程序的最后一条语句。
程序在完成预定任务之后,必须返回DOS,返回DOS最常用的方法是使用DOS系统4CH功能调用,即连续执行以下2条指令:
MOV AH,4CH
INT 21H
题目:加法程序实现46H+52H,并将运算结果存在在数据段SUM中。
思路:先在数据段中定义一个随机字节,在代码段中,先将46H赋值一个通用寄存器,之后实现ADD相加指令,最后赋值给SUM。
.586
DATA SEGMENT USE16
SUM DB ?
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
SEG:MOV AX,DATA
MOV DS,AX
MOV AL,46H
ADD AL,52H
MOV SUM,AL
MOV AH,4CH
INT 21H
CODE ENDS
END SEG
注意:这里最后无输出,因为我们在这里只是做了相加后,存入数据段中,并没有显示在屏幕的功能。
格式:
MOV AH,功能号
设置入口参数
INT 21H
分析出口参数
作用:等待输入一个字符,有回显,以该字符的ASSCII码输出在屏幕上。
入口参数:无
出口参数:AL=按键的ASCII码。若AL=0,表明按键时功能键,需再次调用本功能,才能返回按键的扩展码。
举例:
MOV AH,1
INT 21H
作用:显示一个字符
入口参数:DL=待显字符的ASCII码
出口参数:无
举例:
MOV DL,41H ;显示‘A’
MOV AH,2
INT 21H
注意:该项功能会破坏AL寄存器的内容
作用:显示字符串
入口参数:DS:DX=字符首地址,字符串必须以‘$’为结束标志符。
出口参数:无
举例:
.586
DATA SEGMENT USE16
MESG DB 'I AM HERE$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
LAST:
MOV AH,9
MOV DX,OFFSET MESG
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
大家可以看出来,利用9号功能调用时候,需要把字符串的偏移地址送到DX里面。
作用:等待键入一串字符送用户程序数据缓冲区,并保存在缓冲区里,同时在屏幕上显示字符串。
入口参数:
DS:DX=输入字符的缓冲区的首地址
题目:询问用户姓名并等待用户键入,用户输入姓名后敲击回车键,程序再把键入的姓名复制到屏幕上。
.586
DATA SEGMENT USE16
MESG DB 'WHAT IS YOUR NAME? $'
BUF DB 30
DB ?
DB 30 DUP(?)
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
AGAIN:
MOV AH,9
MOV DX,OFFSET MESG
INT 21H ;询问姓名
MOV AH,0AH
MOV DX,OFFSET BUF
INT 21H ;存入内存
MOV BL,BUF+1
MOV BH,0 ;实际键入字符个数给BX
MOV SI,OFFSET BUF+2
MOV BYTE PTR[BX+SI],'$'
MOV AH,2
MOV DL,0AH ;换行
INT 21H
MOV AH,9
MOV DX,OFFSET BUF+2
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG