文章目录
前言
第一次汇编语言实验课,运行两个比较基础的小程序,再对程序中的代码进行分析。
一、运行程序
1.输出Hello World!
;完整段的Hello World程序
DATAS SEGMENT
STRING DB 'Hello World!',13,10,'$'
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
LEA DX,STRING
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
2.计算两个数的和
;完整段的求3+5的和
DATAS SEGMENT
FIVE DB 5
DATAS ENDS
STACKS SEGMENT
DB 128 DUP (?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AL,FIVE
ADD AL,3
ADD AL,30H
MOV DL,AL
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
二、理解程序
1.1 DB:
STRING DB 'Hello World!',13,10,'$'
汇编语言中的伪操作命令,它用来定义操作数占用的字节数。
13表示回车符
10表示换行符
$是汇编下字符串的结束标志
1.2 伪指令:
DW:定义字(2字节)
PROC:定义过程
ENDP:过程结束
SEGMENT:定义段
ASSUME:建立段寄存器寻址
ENDS:段结束
END:程序结束
1.3 LEA:
LEA DX,STRING
有效地址传送指令,是把一个内存变量的有效地址送给指定的寄存器,只用于传送地址,其指令格式如下:
LEA OPRD1,OPRD2
将源操作数给出的有效地址传送到指定16位寄存器中。
OPRD1为目的操作数,可为任意一个16位的通用寄存器
OPRD2为源操作数,可为变量名,标号或地址表达式
该指令常用来设置串操作指令所需的寄存器指针的初值。
1.4 MOV:
MOV AX,DATAS
MOV DS,AX
LEA DX,STRING
MOV AH,9
MOV是数据传送指令
格式为:
MOV OPRD1,OPRD2
功能是将一个源操作数送到目的操作数中,即OPRD1<–OPRD2,指令执行后,目的操作数的值将会被改变,而源操作数的值不变。
这类指令的源操作数和目的操作数的长度必须一致,即两者同为8位或者16位,否则就会出错。
OPRD1为目的操作数,可以是寄存器、存储器、累加器
OPRD2为源操作数,可以是寄存器、存储器、累加器和立即数
MOV的常见语法:
(1)MOV 寄存器,数据
MOV AX,8
这种方法最快
相当于:AX=8
(2)MOV 寄存器,寄存器
MOV AX,BX
次快,在寄存器中寻址
相当于:AX=BX
(3)MOV 寄存器,内存单元
MOV AX,[2]
最慢,在内存中寻址
MOV AH,9
此处表示的是控制字符串的输出,调用参数为DS:DX=字符串首
MOV AH,4CH
INT 21H:
INT 21H是DOS的中断调用,INT是interupt中断的缩写。
注意事项:
1.双操作数指令(除特别说明)的目的操作数与源操作数必须类型一致
2.要求类型一致的两个操作数之一必须有明确的类型,否则要用PTR指明
3.双操作数指令(除特别说明)不允许两个操作数都是存储单元
4.能对专用寄存器进行操作的指令有限,功能不强,使用时要注意
1.5 ;:
:表示注释
2.1 DB:
FIVE DB 5
此处使FIVE=5
2.2 ADD:
ADD AL,3
作用为两数相加
格式:
ADD OPRD1,OPRD2
举个例子:
ADD AX,8
表示将AX寄存器中的数加8,即AX=AX+8
再举一个例子:
ADD AX,BX
表示将AX中的数据和BX中的数据相加存入AX,即AX=AX+BX
ADD AL,30H
表示将AL转化为ASCII码,所以要加30H
2.3 MOV:
MOV AH,2
表示的是显示一个字符,调用参数为待输出字符的ASCII码,所以之前需要有:ADD AL,30H
2.4DUP
DB 128 DUP (?)
DUP是英文duplicate的缩写,是重复的意思,用来定义重复的字节、字、双字、结构等内存缓冲区。
格式:DB 重复次数 DUP(重复内容)
重复内容为“?”时表示只分配存储空间,不指定初值,即初值不确定或未赋值。如果多个存储单元的初值相同,可以用赋值操作符DUP进行说明。
总结
第一次上汇编课是有一些吃力,但是当了解了各个语句的意思以后就简单了不少。