C语言&嵌入式读书我的大学

混子汇编语言学习之03笔记

2021-10-17  本文已影响0人  那个混子

第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中提供了两个指令来对其进行操作

需要注意8086中对栈的操作都是以字为单位的,也就是操作的是两个字节的空间。

SS、SP

8086CPU中,入栈时,栈顶从高地址向低地址方向增长

分析:

push ax表示将寄存器ax中的数据送入栈中,由两步完成。

先改变SP,后向SS:SP处传送

SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶;
将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

先读取SS:SP中数据,后改变SP
如图所示: image.png

pop 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中;后出栈
上述例子对本章进行了一个总结学习,需要明白栈是先进后出的!

参考资料 王爽《汇编语言第三版》

欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!

上一篇下一篇

猜你喜欢

热点阅读