汇编笔记(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

posted @ 2025-05-06 10:20  myrrrr  阅读(26)  评论(0)    收藏  举报