文章目录
使用汇编语言编写一个完整的程序,步骤大致如下:
1、编写源代码,文件名拓展名为.asm
2、编译、链接(可以使用微软的MASM编译器)
3、调试、运行
这节我们来看下一个最简单的汇编代码包含哪些内容。下面是一段简单的汇编语言的代码:
assume cs:code
code segment
mov ax,1122h
mov bx,3344h
add ax,bx
mov ah,4ch
int 21h
code ends
end
从上面的代码可以看出,汇编语言由两类指令组成:
1、汇编指令
2、伪指令
一、指令分类
1、汇编指令
如mov、add、sub等
有对应的机器指令,可以被编译为机器指令,最终被CPU执行
2、伪指令
如assume、 segment、ends、end等
没有对应的机器指令,由编译器解析,最终不被CPU执行扫描二维码关注公众号,回复: 14251092 查看本文章![]()
汇编注释,以分号开头,如下代码:
;-------- 数据段 --------
data segment
string db 'Hello World!$'
data ends
二、伪指令
这里取几个常用的来说明
1、assume
声明code段是代码段(cs段)。给程序员看的,也可以不声明。
2、segment、ends
其作用是定义一个段,segment代表一个段的开始,ends代表一个段的结束,使用格式为:
段名 segment
...
...
段名 ends
一个有意义的汇编程序中,至少要有一个段作为代码段存放代码
3、end
编译器遇到end时,就结束对源程序的编译。
三、汇编指令
这里介绍几个常见汇编指令。
1、退出程序指令
实现一:
mov ah,4ch
int 21h
实现二:
mov ax, 4c00h
int 21h
2、中断
2.1、概念
中断是由于软件的或硬件的信号,使得CPU暂停当前的任务,转而去执行另一段子程序。
也就是说,在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止当前程序的执行转而处理这个新情况的过程就叫做中断。
2.2、中断的分类
1、硬中断(外中断):由外部设备(比如网卡、硬盘)随机引发的,比如当网卡收到数据包的时候,就会发出一个中断
2、软中断(内中断):由执行中断指令产生的,可以通过程序控制触发
2.3、本质
从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。
2.4、中断指令
可以通过指令int n产生中断
n是中断码,内存中有一张中断向量表,用来存放中断码对应中断处理程序的入口地址。
CPU在接收到中断信号后,暂停当前正在执行的程序,跳转到中断码对应的中断向量表地址处,去执行中断处理程序。
常见中断:
int 10h:用于执行BIOS中断。
int 3:是“断点中断”,用于调试程序
int 21h:用于执行DOS系统功能调用,AH寄存器存储功能号
更多的中断指令,点击这里下载。
3、call、ret
call和ret联合使用的作用其实就是高级语言中的函数调用。
1、call 标号:
1、将下一条指令的偏移地址入栈
2、转到标号处执行指令
2、ret 标号:将栈顶的值出栈,赋值给ip。
在使用的时候,考虑点比较多,主要有以下几个方面:
有无参数
有无返回值
现场保护
局部变量
堆栈平衡
四、指令处理的数据长度
1、8086指令能处理2种尺寸的数据:byte、word
2、mov [0], 20H
指令是否正确?
1、
mov byte ptr [0], 20H
将20H放入0位置内存的字节单元,占用1个字节
2、mov word ptr [0], 20H
将20H放入0位置内存的字单元,占用2个字节
3、很多指令都可以通过byte ptr
或者word ptr
来指明所需要操作内存的数据长度。
3、有些指令有默认的操作数据长度,比如push [0]、pop [0]的操作数据长度只能是2个字节。