汇编笔记(3)
应用程序 字符串内容后面一定要有一个0,标记字符串的结束
通过检测0知道是否已经处理完整个字符串,可以用jcxz检测0
解决寄存器使用上的冲突问题:在子程序开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。可以用栈来保存寄存器中的内容
标准框架:
子程序开始:子程序中使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret、retf)
除法溢出:CPU执行div等除法指令时,结果的商过大,超出了寄存器所能存储的范围,将引发CPU的一个内部错误
子程序描述(show_str)
在指定位置用指定颜色,显示一个用0结束的字符串
子程序描述(divdw)
进行不会产生溢出的除法运算,被除数dword型,除数word型,结果dword型
子程序描述(dtor)
将word型数据转变为表示十进制数的字符串,字符串以0为结尾符
标志寄存器
CPU内部的一种特殊的寄存器
作用:
(1)存储相关指令的某些执行结果
(2)为CPU执行相关指令提供行为证据
(3)控制CPU的相关工作方式
存储的信息通常被称为程序状态字(PSW)
大多数运算指令会影响标志寄存器;传送指令对标志寄存器大多没有影响
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| OF | DF | IF | TF | SF | ZF | PF | CF |
ZF:零标志位(结果为0,zf=1;结果非0,zf=0)
PF:奇偶标志位(1的个数为偶数,pf=1;为奇数pf=0)
SF:CPU对有符号数运算结果的一种记录,记录数据的正负(结果为负,sf=1;非负sf=0)
CF:进位标志位
OF:溢出标志位(发生溢出of=1)
如果CF的值是被sub指令设置的,是借位值;如果被add指令设置,是进位值
DF:方向标志位,控制每次操作后si、di的增减
格式:movsb
df=0 每次操作后si、di递增
df=1 每次操作后si、di递减
abc指令
带进位加法指令,利用CF位上记录的进位值
(ax)=(ax)+(bx)+CF
加法可以分为两步:
(1)低位相加
(2)高位相加再加上低位相加产生的进位值
inc指令和loop指令不影响CF位
sbb指令
带借位减法指令,利用CF位上记录的借位值
(ax)=(ax)-(bx)-CF
cmp指令
比较指令,功能相当于减法指令,只是不保存结果
如果没有溢出,逻辑上真正结果的正负=实际结果的正负
如果有溢出,逻辑上真正结果的正负≠实际结果的正负
可以同时进行两种比较:无符号数比较和有符号数比较
条件转移指令
所有条件转移指令的转移位移都是[-128,127]
je:等于则转移 zf=1
jne:不等于则转移 zf=0
jb:低于则转移 cf=1
jnb:不低于则转移 cf=0
ja:高于则转移 cf=0且zf=0
jna:不高于则转移 cf=1或zf=1
movsb:传送一个字节后si和di加/减1
movsw:传送一个字后si和di加/减2
movsd:传送一个双字后si和di加/减4
rep:根据cx的值,重复执行后面的串传送指令
cld:将标志寄存器的df位置0
std:将标志寄存器的df位置1
pushf:将标志寄存器的值压栈,popf:从栈中弹出数据,进入标志寄存器中
内中断
执行完当前正在执行的指令后,检测到从CPU外部发送过来或内部产生的一种特殊信息(中断信息),并且可以立即对所接收到的信息进行处理
中断:CPU不再接着向下执行,而是转去处理这个特殊信息
可能产生中断信息的情况
(1)除法错误
(2)单步执行
(3)执行into指令
(4)执行int指令
中断信息中必须包含识别来源的编码;中断类型码为一个字节型数据可表示256种中断信息的来源
中断类型码的作用:定位中断处理程序
中断向量:中断处理程序的入口地址
CPU知道中断类型码就可以将中断类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址
一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,入口地址包括段地址和偏移地址,所以一个表占两个字,高地址字存放段地址、低地址字存放偏移地址
中断过程
用中断类型码找到中断向量,并用他设置CS和IP,由CPU硬件自动完成
找到入口地址的最终目的是用它设置CS和IP,使CPU执行中断处理程序
用call指令先保存当前CS和IP的值,然后再设置CS和IP
iret的出栈顺序:IP,CS,标志寄存器
如果发生除法溢出将产生中断类型码为0的中断信息
0号中断处理程序功能:在屏幕中间显示"overflow!",然后返回操作系统
"-"是编译器识别的运算符号,编译器可以用他来进行两个常数的减法
do0程序:
(1)相关处理
(2)向显示缓冲区送字符串"overflow!"
(3)返回DOS
主要任务:显示字符串
字符串"overflow!"应该存放在一段不会被覆盖的空间中
单步中断
如果检测到标志寄存器TF位为1,则产生单步中断,引发中断过程
单步中断的中断类型码为1,引发过程:
(1) 取得中断类型码1
(2) 标志寄存器入栈,TF、IF设置为0
(3) CS、IP入栈
(4) (IP)=(14) , (CS)=(14+2)
在进入中断处理程序之前,设置TF=0,避免CPU在执行中断处理程序的时候发生单步中断
int指令
int n,n为中断类型码,功能:引发中断过程
系统设置的0号中断处理程序的功能是显示"Divide overflow",然后返回系统
用cx存放循环次数,bx存放位移
端口
各种存储器都和CPU的地址线、数据线、控制线相连,CPU操控他们时把他们当作内存
CPU通过端口地址来定位端口
端口所在的芯片和CPU通过总线相连,端口地址和内存地址一样通过地址总线来传送
端口的读写指令只有两条:in和out ,分别用于从端口读取数据和往端口写入数据
在in和out指令中,只能使用ax或al存放从端口中读入的数据或要发送到端口的数据
访问8位端口时用al,访问16位端口时用ax
shl和shr指令
shl:逻辑左移指令
(1)将一个寄存器或内存单元中的数据向左移位
(2)将最后移出的一位写入CF中
(3)最低位用0补充
如果移动位数大于1时,必须将移动位数放在cl中
左移一位相当于X=X*2
shr:逻辑右移指令
(1)将一个寄存器或内存单元中的数据向右移位
(2)将最后移出的一位写入CF中
(3)最高位用0补充
右移一位相当于X=X/2
浙公网安备 33010602011771号