汇编学习笔记(五)
表示内存地址的寄存器:
内存地址由段地址寄存器和偏移地址寄存器共同存储
段地址寄存器:ds, es, ss, cs
偏移地址寄存器:sp, bp, si, di, ip, bx
辣么为什么地址要分段呢?
8086寄存器有 20根 数据线 CPU为16位的无法处理 20 位 的地址信息
所以额外假设了一个地址加法器
运算规则:
物理地址 = 段地址 * 16 + 偏移地址
我记得32上面这样写物理地址的运算的:
基础地址 = 段地址 * 处理器位数
物理地址 = 基础地址 + 偏移地址
个人理解
怎么表示学校:两种方法
1、从家 走 10000m 到学校
2、从家 走 700m 到小姐姐家,再走 9300m到学校
呃,有点体现不出,只能体现偏移。
这么想,我每天早上必须并且只会和一个人一起去学校(不要问为什么,容易百年 | ),
而且它们的家都不在学校且位于家和学校的直线上。
今天小姐姐约我,所以我第一站需要到小姐姐家,等小姐姐,第二站再到学校
明天另一个小姐姐约我,所以我得先到另一个小姐姐家,再去学校。
所以我们上学的第一段一定是我家到某个(小姐姐)朋友家的距离,第二段才是到(小姐姐)朋友家家到学校的距离
这就是所谓的段地址(到(小姐姐)朋友家的距离的集合)
ps:每个(小姐姐)朋友家都不一样(莫想整什么姐妹花),到小姐姐家的距离的最大,和小姐姐家到学校的最大值是一样的
指令:
-d 段地址:偏移地址
-e 段地址:偏移地址(一直空格一直往后)
-r 寄存器名:(修改寄存器指向)
-u 可以将内存中的数据用汇编语言表示出来
ps:可以通过r指令指向自己想访问的地址来实现将数据转化为指令
CPU如何区分数据和指令:
8086 CPU 在任意时刻,将CS,IP所指向的内容当作指令。
在CPU小姐姐休息的时候,CS和IP也不干活,这时候都是二进制,当CPU小姐姐开始工作的时候,CS和IP这两个舔狗就会十分机智的加载好指令信息
所以CPU小姐姐识别指令和数据依赖于CS和IP这两个舔狗(万一哪天不添了怎么办,那你只能忍痛割爱,扔掉这个小姐姐了)
……未完续待……
(自己脑补动画)
更新:2020-02-25 20:35:36
修改CS、IP指令
mov 指令不能作用于CS、IP
能够修改 CS、IP指令称为转移指令
jmp 指令,修改CS和IP寄存器
jmp 目前需要的 写法(还有其他写法)
- jmp 2000:0
- jmp register
例题:假设 cs = 2000H, IP = 0000 写出下列指令的执行过程
a 2000:0 cs = 2000H IP = 0 mov ax, 6622H cs = 2000H IP = 0 + 3 = 3 jmp 1000:3 cs = 1000H IP = 3 + 5 = 8(被指向但没有被读取) mov cx, ax a:1000:0 cs = 1000H IP = 3 mov ax, 0123H mov ax, 0 cs = 1000H IP = 3 + 3 = 6 mov bx, ax cs = 1000H IP = 6 + 2 = 8 jmp bx cs = 1000H IP = 8 + 2 = 10(被指向,没有被读取) mov cx, 0
PS: jmp 下面的指令被指向后,不一定被读取 因为 CS 和 IP 可能被跳转到其他地方
两个比较懵逼的指令:(个人感觉可以用于实现入栈的现场保存)
call 指令 将IP保存起来 内存中
ret 指令 将保存起来的IP 拿出来
8086执行指令的步骤:
- CPU从CS:IP所指向的内存单元读取指令, 存放到指令缓存器中
- IP = IP + 所读指令长度,从而指向下一条指令
- 执行指令缓存器中的内容,回到第一步
为什么这么设计指令执行方式?(老师没讲清楚,暂留)
目前只知道是为了实现call指令
debug指令
- -r 查看、改变CPU寄存器内容,并将CS:指向的机器码翻译成汇编指令;
- -d 查看内存中的内容
- -u 查看内存中的内容,乙汇编语言的方式
- -a 往内存中写入一条汇编指令
- -t 执行一条机器指令
- -e 改写内存中的内容
一个有意思的发现:
alt + 小键盘数字 = ASCII 在txt中