【汇编语言王爽】学习笔记p54-p79(上)

简介: 【汇编语言王爽】学习笔记p54-p79

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

axbxcxdx

sidi

bpspip

csssdses

flag

按位起作用

1668160239168.jpg


特殊之处 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进位

1668160323262.jpg


直接访问flag的方法pushf popf

1668160349679.jpg


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

1668160365155.jpg


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

1的个数为偶数个 pf=1


1668160385147.jpg

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

1668160414082.jpg1668160423231.jpg



见机行事 看作正数负数

1668160430851.jpg


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

1668160440520.jpg1668160447786.jpg

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

1668160457570.jpg

1668160465848.jpg

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

1668160476817.jpg

1668160485027.jpg


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

1668160494803.jpg


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

1668160503751.jpg1668160510410.jpg


128位数相加

1668160519961.jpg


特别注意:思考!

1668160528959.jpg

不可以!!!还有个目的是cf清零


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


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

1668160539090.jpg


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

1668160550224.jpg


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

1668160561547.jpg1668160570213.jpg

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

1668160599398.jpg1668160607237.jpg

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

1668160622408.jpg1668160629236.jpg


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

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

1668160639535.jpg


统计8的数量

1668160652029.jpg


DF方向标志位和段传送—

原本方法:mov ax ,【si】

mov【di】,ax

add si,2

add di,2

1668160666444.jpg

更简洁方法


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

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

1668160676914.jpg1668160691394.jpg


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

1668160701842.jpg

1668160709810.jpg



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


1668160718995.jpg

1668160726173.jpg


移位指令

逻辑左移:影响cf 和cf一起左移 补零

循环左移 影响cf 但是后面也得加上移出去的那个数

算数左移

1668160735694.jpg1668160743604.jpg


shl

sal

rcl


惯常用法:逻辑左移乘法

1668160752417.jpg


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

1668160760839.jpg


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

1668160770063.jpg1668160779388.jpg1668160785049.jpg


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

1668160796280.jpg


标号

1668160805654.jpg

1668160814528.jpg


改进

1668160826023.jpg

1668160833524.jpg



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

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


1668160855211.jpg

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


1668160865904.jpg

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

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

1668160877017.jpg


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


1668160933518.jpg

1668160946924.jpg

1668160956391.jpg

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


1668160989457.jpg

1668160997769.jpg


定址表 – 空间换时间

1668161006384.jpg1668161013948.jpg1668161020632.jpg1668161027265.jpg

1668161035636.jpg

代码的直接定址表—

1668161058182.jpg

1668161067599.jpg

1668161083767.jpg1668161090463.jpg1668161097731.jpg1668161106727.jpg1668161113955.jpg


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

1668161126502.jpg


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

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

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

hello world的写法

1668161137936.jpg1668161144814.jpg


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

1668161154868.jpg


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

1668161162862.jpg

1668161173833.jpg


案例 0号中断

1668161180820.jpg1668161189541.jpg

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

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

1668161215563.jpg


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

1668161223193.jpg


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

1668161230782.jpg


do0子程序–自己制作

1668161241512.jpg


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

1668161252150.jpg


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

1668161263220.jpg1668161270831.jpg


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

1668161281904.jpg


小结!!!

1668161291431.jpg


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

1668161303324.jpg

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

1668161313192.jpg

1668161323096.jpg

1668161331986.jpg

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

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

1668161344167.jpg1668161351160.jpg

中断不响应情况

1668161358254.jpg

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

1668160215029.jpg

相关文章
|
存储 程序员 C语言
【汇编语言王爽】学习笔记p54-p79(下)
【汇编语言王爽】学习笔记p54-p79
102 0
【汇编语言王爽】学习笔记p54-p79(下)
|
人工智能 BI C语言
【汇编语言王爽】进阶-笔记 p22--p40(下)
【汇编语言王爽】进阶-笔记 p22--p40
96 0
【汇编语言王爽】进阶-笔记 p22--p40(下)
|
安全
【汇编语言王爽】进阶-笔记 p22--p40(上)
【汇编语言王爽】进阶-笔记 p22--p40
92 0
【汇编语言王爽】进阶-笔记 p22--p40(上)
|
C语言
【汇编语言王爽】学习笔记-p40-p54
【汇编语言王爽】学习笔记-p40-p54
82 0
【汇编语言王爽】学习笔记-p40-p54
|
存储
【汇编语言王爽】笔记1-p1-p17(上)
【汇编语言王爽】笔记1-p1-p17
93 0
【汇编语言王爽】笔记1-p1-p17(上)
|
4月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
91 1
|
4月前
|
存储 机器学习/深度学习 移动开发
汇编语言指令系列
汇编语言指令系列
202 0