• 【汇编语言王爽】学习笔记p54-p79


    标志寄存器-神秘的第十四个寄存器flag

    axbxcxdx
    sidi
    bpspip
    csssdses
    flag
    按位起作用

    在这里插入图片描述

    特殊之处 OF(overflow)1:ov ; 0:nv -溢出

    DF (direction) 1DN 0UP 方向

    SF sign符号 ng pl 1 negative 0positive

    ZF zero零值 zr / nz zero / notzero

    PF Parity奇偶数 1pe 0 po odd/even

    CF carry进位

    在这里插入图片描述

    直接访问flag的方法pushf popf

    在这里插入图片描述

    ZF 结果是零的话 寄存器就zf=1; 很多如add sub mul都会影响zf

    在这里插入图片描述

    PF parityflag - 记录指令执行后结果的所有二进制位中1的个数

    1的个数为偶数个 pf=1
    在这里插入图片描述

    SF - 结果看作有符号数 结果为负数sf=1;

    在这里插入图片描述
    在这里插入图片描述

    见机行事 看作正数负数

    在这里插入图片描述

    CF 进位标志 CF=1 有进位或借位----针对无符号数

    在这里插入图片描述
    在这里插入图片描述

    对比CF–针对无符号数;OF-针对有符号数

    在这里插入图片描述
    在这里插入图片描述

    综合 一条指令可以带来多少标志寄存器的变化

    在这里插入图片描述
    在这里插入图片描述

    带进位的加法指令adc用cf位记录进位值 adc ax,bx-------就这个机制 -感觉别扭 但是往后看大数相加 合理

    在这里插入图片描述

    adc指令应用 大数相加---------分组-低十六位-高十六位 ;地位产生的进位通过adc解决了!

    在这里插入图片描述
    在这里插入图片描述

    128位数相加

    在这里插入图片描述

    特别注意:思考!

    在这里插入图片描述
    不可以!!!还有个目的是cf清零

    不可以!!! inc di不会影响flag 而add di2 会影响

    sbb—带借位减法指令 sbb ax bx

    在这里插入图片描述

    cmp比较指令 cmp 操作对象1,操作对象2-------二者相减结果不保存----------指令执行后将对flag产生影响—以此确定比较结果

    在这里插入图片描述

    无符号数 例如 相等:zf=1 ; 不等于 zf=0 ;小于:cf = 0;

    在这里插入图片描述
    在这里插入图片描述

    条件转移指令 jxxx标号-----套路je:jump equal 结果相等跳转

    在这里插入图片描述
    在这里插入图片描述

    条件转移指令的使用—直接考虑cmp和jxxx指令配合出来的逻辑含义就可以了----------例如:cmp ah,bh je sadd ah,bh jmp short ok

    在这里插入图片描述
    在这里插入图片描述

    条件转移指令的应用–本质 转移–修改ip; 和cmp配合使用cmp改变标志位

    双分支结构的实现—对比c语言

    在这里插入图片描述

    统计8的数量

    在这里插入图片描述

    DF方向标志位和段传送—

    原本方法:mov ax ,【si】
    mov【di】,ax
    add si,2
    add di,2
    在这里插入图片描述
    更简洁方法

    DF=0:每次操作后si di 递增

    在串处理指令中,控制每次操作后si di的增减 ; 对DF位进行设置的指令:cld df=0;std df=1;

    在这里插入图片描述
    在这里插入图片描述

    rep指令 —根据cx重复执行后面的指令-------常常与串传送指令搭配 rep movsb

    在这里插入图片描述

    在这里插入图片描述

    中断—导学------精华

    在这里插入图片描述

    在这里插入图片描述

    移位指令

    逻辑左移:影响cf 和cf一起左移 补零
    循环左移 影响cf 但是后面也得加上移出去的那个数
    算数左移
    在这里插入图片描述
    在这里插入图片描述
    shl
    sal
    rcl

    惯常用法:逻辑左移乘法

    在这里插入图片描述

    显示的原理—屏幕的内容=显存中的数据

    在这里插入图片描述

    显示缓冲区 每个两个字节,一行八十个-----一行160字节

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    显示想显示的东西 不同颜色

    在这里插入图片描述

    标号

    在这里插入图片描述


    改进
    在这里插入图片描述

    在这里插入图片描述

    改进:标号法a: db 1,2,3,4 ; 然后 用这个数据 就直接 mov si ,offset a ; 随后 做各种操作就直接cs:【si】

    更加改进: 去掉:的数据标号 adb 1,2,3,4,后面就直接 mov si,0 ;然后直接操作 a【si】像数组一样

    在这里插入图片描述

    a db 1,2,3,4,5,6,7,8; b dw 0 其中 b代表地址为code:8,长度为字的内存单元—还表明了长度!

    在这里插入图片描述

    常用方式 数据段中用数据标号

    注意:a db 1,2,3,4,5,…---------a相当于保存开始的地址—也就是指针; c dw offset a,offset b; c还是指针,相当于指针的指针;

    在这里插入图片描述

    在这里插入图片描述

    数据的直接定址表----最简方案 查表 做成一个表 直接要啥给啥

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    利用表 在两个数据集合之间建立一种映射关系

    在这里插入图片描述

    在这里插入图片描述

    定址表 – 空间换时间

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    代码的直接定址表—

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    中断-内(INT)-外(键盘等)

    在这里插入图片描述

    0: 除法错误div除法溢出;1:单步 4:into 溢出中断; n INT指令 下面举例

    13,10表示回车换行; $结束符号

    int 21h中断—然后看ax里面,ax里面是ah是9,执行九号操作 去显示那个ds:dx–然后是里面是显示helloworld

    hello world的写法

    在这里插入图片描述
    在这里插入图片描述

    cpu接到中断信息 去执行中断处理程序–需要改变cs:ip------根据中断信息去找中断处理程序-----查中断向量表

    在这里插入图片描述

    8086cpu的中断向量表—找cs:ip

    在这里插入图片描述
    在这里插入图片描述

    案例 0号中断

    在这里插入图片描述
    在这里插入图片描述

    中断过程—cpu硬件自动完成,用终端类型码找到中断向量,并用它设置cs:ip80

    8086CPU中断过程1.从中断中获取中断类型码2.标志寄存器的值入栈----中断过程重要改变标志寄存器的值,需要先行保护。3设置标志寄存器的第八位tf和第九位if的值为0.4cs内容入栈5ip内容入栈6从中断向量表中读取中断处理程序的入口地址,设置cs:ip

    在这里插入图片描述

    编制中断处理程序----常驻内存

    在这里插入图片描述

    自己编织中断处理程序–除法错误为例

    在这里插入图片描述

    do0子程序–自己制作

    在这里插入图片描述

    把自己的程序安装到内存里面 再把这个地址写道中断向量表

    在这里插入图片描述

    用内存复制的那个程序指令----从si 复制到 di----串传送-----长度–offset do0end-offset do0

    在这里插入图片描述

    在这里插入图片描述

    设置中断向量表 就是把内存那个地方改一下数值

    在这里插入图片描述

    小结!!!

    在这里插入图片描述

    常驻内存程序编制-----套路-----由自己安装到内存的指定区域的代码和数据

    在这里插入图片描述
    如果是haike呢–她骗人安装他的程序,然后运行。他的程序把自己的脏东西串传送到内存某个地方,然后触发中断,让自己的脏东西获得cpu运行,然后就可以显示自己的东西了。或者简单点,别人运行他的程序,他就直接开始干活了,脏东西挥洒了
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    单步中断–寄存器flag—TF trap flag ,tf=1每条指令执行后产生陷阱,由系统控制计算机,当tf=0,cpu正常工作,不产生陷阱

    if interrupt flag 当if=1,允许cpu相应可屏蔽中断请求,if=0关闭中断

    在这里插入图片描述
    在这里插入图片描述

    中断不响应情况

    在这里插入图片描述

    原因–设置ss:sp强制要求连续完成 以此保证栈的准确正确

    在这里插入图片描述

    int n引发中断

    在这里插入图片描述
    在这里插入图片描述

    疑问 什么时候if tf恢复?

    @

    int指令调动子程序,此子程序就是中断处理程序简称 中断例程 ------可以自定义中断例程来实现特定功能

    具体7ch 存在0000:7ch*4这个地方

    在这里插入图片描述

    中断例程 参数:放在ax里面可以

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    出入栈 操作一一对应,执行irep返回的时候意义出栈

    在这里插入图片描述

    中断例程2

    在这里插入图片描述
    在这里插入图片描述

    bios 和 dos中断处理

    bios–在系统版的rom存放–容量8KB,地址从FE000H开始

    在这里插入图片描述

    BIOS要做硬件系统的检测和初始化工作,外部中断和内部终端的中断例程也在里面 对于硬件设备进行io的中断例程,还有和其他硬件操作的中断例程 里面都有---------ddr3八脚直接式BIOS芯片

    bios 如此好 解放了大量程序员工作 不去理解底层

    在这里插入图片描述

    BIOS-比如显示内容 必须要算 推算了解显示的内存区域在哪里

    在这里插入图片描述

    bios的10h中断,(ah)=2调用第十号h终端的2耗子程序没设置光标位置

    (ah)=9 调用10h中断的9号子程序 在光标位置显示字符

    bios调用两个中断完成 显示高亮闪烁a

    在这里插入图片描述

    直接BIOS终端手册-----例子

    在这里插入图片描述
    在这里插入图片描述

    汇编还有DOS中断–强大

    在这里插入图片描述
    在这里插入图片描述

    小结-bios,dos中断

    在这里插入图片描述
    在这里插入图片描述

    程序返回 int 21H DOS中断例程----其实就是mov ax,4c00h int 21h

    显示高亮a 方便的 dos中断例程!!牛逼

    在这里插入图片描述

    Bios和dos中断例程的安装过程

    在这里插入图片描述

    端口的读写–声音为例: out in 等指令

    在这里插入图片描述

    in al 61h 这条指令为例实际上就是控制 设备控制器(61h)

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    注意 端口-------就是外部设备

    cpu可以访问三种东西,十四个寄存器,内存单元,端口—就—外部设备-------各种网卡 显卡。。主板上的接口芯片。

    在这里插入图片描述

    各种芯片都有寄存器,由cpu读写

    cpu把各个寄存器当作端口统一编制,某几个地址对应一个设备

    端口读写就用in out来操作

    在这里插入图片描述

    端口的读写,cpu地址线选中芯片寄存器,cpu发出控制线的读命令,然后通过数据线送进cpu数据

    在这里插入图片描述

    精彩!

    在这里插入图片描述
    在这里插入图片描述

    IO端口分配–共

    在这里插入图片描述
    在这里插入图片描述

    in out只能用ax或者al来存放端口读入数据或者发送的数据

    # CMOS RAM芯片—包含一个实时钟(电子表)和一个128个存储单元的ram存储器------这个128B的ram里面存内部实时钟 系统配置信息,相关的程序(用于开机时配置系统信息)

    在这里插入图片描述

    这块ram靠电池供电 不丢失信息—芯片由70h 71h端口读写-------70h提供地址 71提供数据

    在这里插入图片描述提取CMOS RAM存储的时间信息

    提取cmos ram时间 信息 —时间信息用BCD码存放的-------

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    外设的连接和中断

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    外中断—可屏蔽中断-cpu检测到可屏蔽终端信息的时候如果IF=1那么cpu执行完当前指令后响应中断 引发中断过程,IF=0那么不响应可屏蔽中断

    不可屏蔽中断 必须相应的外中断,cpu检测到不可屏蔽信息是 ,执行完当前指令后立即响应,引发终端过程,

    对于8086。不可屏蔽中断的中断类型码固定为2

    在这里插入图片描述
    在这里插入图片描述

    外中断处理过程–1.取中断类型吗 对比内部终端 cpu内部自己生产 2. 标志寄存器入栈 置if0 tf0如果中断过程中想要处理可屏蔽中断 可以用指令将if置为1 3 csip入栈 4 转去处理中断处理

    不可频闭终端: 标志寄存器入栈if=0tf=0;注意csip入栈,3ip=(8),cs=(0ah)

    注意 不可屏蔽中端中断值固定为2

    注意8086 设置if指令 sti set if为1,cli clear 清理为0

    在这里插入图片描述

    PC键盘的处理过程----1键盘输入2引发9号中断3执行int9中断例程

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    pc机键盘的处理过程-引发终端

    在这里插入图片描述

    bios 键盘缓冲区在内存 能存放十五个键盘输入 用一个字存 高位的前半个字放扫描码 低位放字符码 也就是ascii码

    在这里插入图片描述

    控制键 切换键 处理就是 用内存的一个字节0040:17这个地方一个字节来存放键盘键盘状态---------键盘状态

    在这里插入图片描述

    执行int 9--------读出60h端口中的扫描码—根据扫描码分情况对待—如果自福建的扫描码,就把他的字符码送到内存的bios键盘缓冲区

    如果控制键的扫描码 就将其转变为状态字节就那个 字节里面–内存的 写入内存中存储状态字节的单元然后对键盘系统进行县官的控制

    在这里插入图片描述
    在这里插入图片描述

    实例 输入a处理过程

    在这里插入图片描述
    在这里插入图片描述

    定制键盘输入处理----int9 中断例程----满足个性需求

    在这里插入图片描述

    依次显示a-z

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    按下esc后改变现实颜色–

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    按下esc改变颜色的实现—v1.0

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    改写中断例程-以int9 为例-------和定制处理不同,常驻内存,更加持久-------设备底层技术常用

    在这里插入图片描述

    在这里插入图片描述

    很享受的感觉

    @ 如何操作外部设备

    键盘操作为例

    在这里插入图片描述

    对键盘输入的处理的int9h中断和int 16h中断

    在这里插入图片描述

    输入引发的动作

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    读出来 —程序员用 int16h–来做—16字 用环形队列 可存储扫描15个按键扫描码----(因为是环形的留一个判空–数据结构)

    在这里插入图片描述

    小结 调用16h从缓冲区读数据------int 9 和int 16是相互配合的程序------软硬件搭配 9是硬件------16软件来做

    在这里插入图片描述
    在这里插入图片描述

    应用实例 用键盘输入更改屏幕颜色

    在这里插入图片描述
    在这里插入图片描述

    应用 字符串输入

    在这里插入图片描述
    在这里插入图片描述

    程序的处理过程

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    磁盘读写----硬盘,-------

    在这里插入图片描述

    BIOS提供磁盘的直接服务 int13h

    在这里插入图片描述

    用BIOS 对 磁盘进行读操作 int13h

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    卧槽 从扇区,磁道,面都有规定—如 读取c盘 0面 1扇区的内容到0:200--------还有磁头号 驱动器号—是硬盘还是软盘

    写操作

    在这里插入图片描述

    dos中断对磁盘文件的支持 int 21h

    在这里插入图片描述

    dos中断对文件操作非常强大-------比c语言提供的强大很多--------用指定的驱动器和路径创建一个新目录---------用手册

    在这里插入图片描述

    让计算机唱歌最后--------

    在这里插入图片描述
    在这里插入图片描述

    相关硬件以及控制--------主要有芯片8253和 芯片8255

    在这里插入图片描述

    8253芯片(定时/计数器)的设置

    在这里插入图片描述

    注意:8253初始化 --就这样设置—ax放唱歌的频率值(大致是)8255(并行io)控制扬声器的开关------------这两个芯片的驱动 都是通过端口操作进行的

    在这里插入图片描述

    音符和发音频率的对应关系 对应这个 让计算机唱歌

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    【网络安全】SQL注入专题讲解
    Spring Boot项目如何打成war包部署呢?
    mmcls 多标签模型部署在torch serve
    Python面向对象(全套)
    LeetCode 0813. 最大平均值和的分组
    Unity下载资源且保存
    自动化立体仓库控制系统-过程通信处理
    Java版本spring cloud + spring boot企业电子招投标系统源代码
    Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
    B. Kalindrome Array
  • 原文地址:https://blog.csdn.net/weixin_43796670/article/details/126458406