汇编语言程序以段为单位进行书写,一般把数据定义在数据段里,程序写在代码段中。下面给出段的定义语法:
段名 SEGMENT
...(段的内容)...
段名 ENDS
注意事项:
数据的定义是指对给出的数据分配存储单元,并将它们以标准的格式存放到数据段中。数据定义的语句元素包括DB DW DD DQ DT等。
给出下面的汇编程序段
DATA SEGMENT
X DB -1,255,'A',3+2,?
DB "ABC",0FFH,11001010B
Y DB 3 DUP(?)
DATA ENDS
下面对上面的代码段进行解释:
字数据的位数为16位,只需要将上面字节定义的语法中的DB修改为DW即可。
双字数据为32字节,只需要将上面字节定义的语法中的DB修改为DD即可。需要注意的是,数据的高位存放在地址较大的单元里,数据的低位存放在地址较小的单元里。
只需要将DB伪指令修改为DQ和DT即可。
指令语句是指与一条机器指令相对应的代码语句,其一般格式如下:
[标号:] 操作码 [操作数] [;注释]
语法解释:
操作数可以分为寄存器操作数、立即数操作数和存储器操作数三类。关于寄存器操作数,需要注意的是寄存器IP和FLAGS不能作为操作数出现在指令中;关于立即数操作数,需要注意的是立即数操作数不能用作目的操作数。下面着重介绍存储器操作数,先介绍两点基础知识:
既然我们已经设置好了段基址,那么只需要有偏移地址即可找到内存中正确的存储单元。给出偏移地址的方法有直接和间接两种方法。直接法是指直接在指令中写出存储单元的偏移地址,间接法则是把存储单元的偏移地址事先装入一个寄存器中,需要时通过这个寄存器中的值来找到这个存储单元。
(1)直接法语法:
MOV 目的寄存器, 变量名[+字节偏移量]
此语句的作用是以DS寄存器中的内容作为段基址,以数据段中指定变量名的偏移量(与字节偏移量)的和作为偏移地址,将指定存储单元中的值放入目的寄存器中。
(2)间接法语法:
MOV 间接寻址寄存器, OFFSET 变量名
(下面是需要使用偏移地址时的语句)
MOV 目的寄存器, 间接寻址寄存器
语法解释:
程序段的一般格式如下:
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START: MOV AX, DATA
MOV DS, AX
...(其他指令部分)...
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
语法解读:
基本传送指令是使用最频繁的指令,需要熟练掌握。格式如下:
MOV 目的操作数, 源操作数
语法解释:
强制类型转换语法(要谨慎使用):
数据类型 PTR[变量名]
堆栈也是用户使用的存储器的一部分,用于存放临时性的数据和一些其他信息。堆栈段的定义语法如下:
堆栈名 SEGMENT STACK
(堆栈内容)
堆栈名 ENDS
语法解释:
常用的堆栈相关指令包括PUSH POP PUSHF和POPF,语法如下:
PUSH 源操作数 ;将指定操作数入栈保护
POP 目的操作数 ;将栈顶操作数恢复到指定位置
PUSHF ;标志寄存器内容入栈保护
POPF ;标志寄存器出栈恢复
符号定义相当于C语言中的#define编译预处理,用于进行符号的等价替换,符号定义的语法如下所示:
符号名 EQU 表达式
语法解释:
另一种进行符号定义的方式是使用“=”符号,具体语法如下:
符号名 = 常数表达式
语法解释:
使用等号定义符号时只能使用常量表达式。
可以使用SEG来取地址表达式所在段的段基址,具体使用方法为:
SEG 地址表达式
对于两个操作数相加应该使用ADD指令,指令语法如下:
ADD 目的操作数, 源操作数
语法解释:
除此之外,还有一条INC指令实现操作数的自增,语法如下:
INC 操作数
语法解释:
减法指令和加法指令的使用是对称的。加法中的ADD对应减法中的SUB;加法中的INC对应减法中的DEC。
乘法指令为MUL,除法指令为DIV,使用方法和加减法类似。由于乘除法使用较少,因此不过多介绍。
循环指令的语法如下:
LOOP 标号
语法解释:
逻辑运算有AND OR XOR和NOT四种,使用语法如下:
逻辑运算操作码 目的操作数 源操作数
使用情况:
所有的DOS系统功能调用都是通过软中断指令INT 21H来实现的。INT 21H是一个具有90多个子功能的中断服务程序。INT 21H对每一个子功能都进行了编号,这个编程成为功能号。
DOS系统功能调用方法:
MOV 功能号 ;把功能号放入寄存器AH中
......
(在其他寄存器中放入该功能要求的入口参数)
......
INT 21H ;调用DOS系统功能
常用功能:
功能号1,输入字符以ASCII码的形式存放在累加器AL中同时显示出来。
MOV AH 01
INT 21H
功能号2,屏幕显示存放在DL寄存器中的字符。
MOV AH 02
MOV DL 待显示字符
INT 21H
功能号9,用于在显示器上显示一个存放在寄存器DX中的字符串,被显示的字符串必须以’$'作为结束符。
MOV AH 09
MOV DX 待显示字符串首地址
INT 21H
一个程序执行完成后使得程序正常退出并返回DOS的功能,功能号为4CH。
MOV AH 4CH
INT 21H
子程序名 PROC
...
RET ;表示子程序返回
子程序名 ENDP ;表示子程序段定义结束
CALL 子程序名
MOV DX 端口地址
......
(其他寄存器初始化)
......
OUT DX 需要传输到端口的数据所在的寄存器
使用NOP表示执行一条空指令,不进行任何操作。当指令之间需要有延时时,可以插入NOP指令。
NOP
CMP指令格式如下:
CMP 目的操作数,源操作数
语法解释:
JGE 前>=后 Jump if greater or equal
JG 前>后 Jump if greater
JLE 前<=后 Jump if less or equal
JL 前<后 Jump if less
JNE 前不等于后 Jump if not equal
JE 前等于后 Jump if equal
文章已获作者授权转载,版权归原作者所有,如有侵权,与本账号无关,可联系删除。https://blog.csdn.net/hanmo22357/article/details/127883179