混子汇编语言学习之03笔记
第3章
开篇引言
本章核心内容为字的理解认识、栈、和几个汇编指令的理解。
栈非常重要,念“zhan”,这个东西也是面试最常考的东西。
1、内存中字的储存
在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连续的内存单元来存放,这个字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。
例子容易记忆:
(1)0地址单元中存放的字节型数据:20H;
(2)0地址字单元中存放的字型数据:4E20H;
(3)2地址单元中存放的字节型数据:12H;
(4)2地址字单元中存放的字型数据:0012H;
2、DS 和 [address]
DS寄存器:通常用来存放要访问数据的段地址
[address]表示一个偏移地址为address的内存单元,段地址默认放在ds中
通过数据段段地址和偏移地址即可定位内存单元。
例子:
mov bx, 1000H //bx = 1000H
mov ds,bx //ds = 1000H,前面两步主要是为ds赋值,也就是提供段地址,因为ds寄存器不能直接进行数值赋值!
mov al,[0] //把10000H(1000:0)中的数据赋值给al;
3、字的传送
8086CPU是16位结构,有16根数据线,一次性可以传输16位数据,也就刚好一个字的数据。
需要注意一个字的数据占两个字节,也就是16位,对应的如果往地址里面写值时,这个偏移地址应该是以2为间隔的!
4、栈
栈是一种具有特殊的访问方式的存储空间。
栈先进的后出,后进的先出
书中的例子比较形象好理解:
栈的基本操作
- 出栈:从栈顶取出一个元素。
- 进栈:将一个新元素放到栈顶。
CPU的栈机制
栈是定义的一段内存空间,8086中提供了两个指令来对其进行操作
- PUSH:出栈指令
- POP:入栈指令
需要注意8086中对栈的操作都是以字为单位的,也就是操作的是两个字节的空间。
SS、SP
- 栈段寄存器SS,存放段地址,
- SP寄存器存放偏移地址,
任意时刻,SS:SP指向栈顶元素
8086CPU中,入栈时,栈顶从高地址向低地址方向增长
。
分析:
push ax
表示将寄存器ax中的数据送入栈中,由两步完成。
先改变SP,后向SS:SP处传送
SP=SP-2,SS:SP
指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。
先读取SS:SP中数据,后改变SP
如图所示: image.pngpop ax
表示从栈顶取出数据送入ax,由以下两步完成。将SS:SP指向的内存单元处的数据送入ax中;
SP=SP+2,SS:SP
指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
例子理解:
要求:
1、将10000H~1000FH这段空间当作栈,初始状态栈是空的;
2、设置AX=001AH,BX=001BH;
3、将AX、BX中的数据入栈;
4、然后将AX、BX清零;
5、从栈中恢复AX、BX原来的内容。
mov ax, 1000H
mov ss, ax //初始化段地址ss为1000H
mov sp, 0010H //设置栈顶的偏移地址,因为栈空,故SP=0010H(最底部字单元地址加2)
mov ax, 001AH //ax=001AH
mov bx, 001BH //bx=001BH
push ax //将ax压栈,地址为1000:000EH 先进栈
push bx ; //将bx压栈,地址为1000:000CH 后进栈
sub ax, ax // ;将ax清零,也可以用mov ax,0,
//;sub ax,ax的机器码为2个字节,
// ;mov ax,0的机器码为3个字节。
sub bx, bx //同上
/*从栈中恢复ax、bx原来的数据*/
pop bx ; //出栈,数据储存到bx中;先出栈
pop ax ; //出栈,数据储存到ax中;后出栈
上述例子对本章进行了一个总结学习,需要明白栈是先进后出的!
参考资料 王爽《汇编语言第三版》
欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!