中断机制
; 将代码段寄存器和我们的代码段关联起来
; 将数据段寄存器和我们的数据段关联起来
; 注:这里的关联并没有任何实际操作,相当于给我们自己的注释而已
; 相当于即使不写这一行也没有关系
assume cs:code, ds:data
; 数据段开始
data segment
; 创建字符串
; 汇编打印字符串要在尾部用 $ 标记字符串的结束位置
; 将字符串用hello做一个标记,方便后面使用它
hello db 'Hello World, Whip!$'
; 数据段结束
data ends
; 代码段开始
code segment
; 指令执行的起始,类似于C语言的main函数入口
start:
; 汇编语言不会自动把数据段寄存器指向我们程序的数据段
; 将数据段寄存器指向我们自己程序的数据段
mov ax, data
mov ds, ax
; 打印字符串的参数
; DS:DX=串地址,将字符串的偏移地址传入dx寄存器
; 字符串是在数据段起始创建的,它的偏移地址是0h
; offset hello 即找到标记为hello的数据段字符串的编译地址
; 还可以写成 mov dx, 0h
mov dx, offset hello
; 打印字符串,ah=9h代表打印
mov ah, 9h
int 21h
; 正常退出程序,相当于高级语言的 return 0
mov ah, 4ch
int 21h
; 代码段结束
code ends
; 程序的结束
end start
x86的中断机制与单片机相似,中断是由于软件或者硬件的信号使CPU暂停当前的任务,转而去执行另一段服务程序。
硬中断(外中断):由外部设备,如网卡、硬盘随机引发的,比如网卡收到数据包的时候,就会发出一个中断。类似于单片机硬件中断
软中断(内中断):由执行中的指令产生的,可以通过程序控制触发。
x86一般通过int中断码配合ah寄存器来使用:内存中有一张中断向量表,用来存放中断码处理中断程序的入口地址。CPU在接受到中断信号后,暂停当前正在执行的程序,跳转到中断码对应的向量表地址处去执行中断。
常见中断:
int 10h 用于执行BIOS中断
int 3 断点中断,用于调试程序
int 21h 用于执行DOS系统功能调用,AH寄存器存储功能号。
int 21h --ah=09H 显示字符串 会使用参数DS:DX=串地址 返回(DS:DX+1)=实际输入的字符数
int 21h --ah=4c 带返回码结束 会使用参数AL=返回码 无返回参数