汇编语言第三章小结

第三章 内存访问

字数据在内存中的存储

1.      内存以字节为单位,划分为若干个单元

2.      字数据的存-取原则:高-高  低-低(小端法)

即:

① 字数据的低位字节存放在低地址内存单元

字数据的高位字节存放在高地址内存单元

② 取低地址内存单元地址作为字数据地址

例1:

字数据124EH的地址是( 1 )

字数据3020H存入内存后地址为4,则4存放( 30H ),3存放( 20H )

例2:

从地址单元1取出一个

(1)     字节数据为:  4EH

(2)     字数据为:124EH

(3)     双字数据为:2000124EH

数据在内存和CPU之间的传送

1.      要在CPU和内存单元之间传送数据,就必须知道内存单元的地址。

2.      执行指令时,默认情况下,8086自动取寄存器DS中的值为内存单元的段地址。

3.      用mov指令从10000H中读取数据

1)10000H用段地址和偏移地址表示为1000:0

2)将1000H放入ds,然后用 mov al,[0]

[…]表示一个内存单元,[…]中的数字表示内存单元的偏移地址,段地址默认放在ds内执行时自动取出

4.      DS寄存器(数据段段寄存器,用于存放数据段的「段地址」)

  说明:

  (1)     将一段内存用作数据段,是编程时的一种安排

  (2)     在mov, add, sub等汇编指令中,访问内存单元时,默认情况下,指的是数据段。

          mov  ax, [1]    ;ax? ((ds)) x 16 + 1)

汇编指令mov, add, sub

1.      mov形式

注意:

1) 两个操作数长度要一致

2) 关于常数(也叫立即数)

① 不能作为第1个操作数(目的操作数)

② 作第2个操作数(源操作数)时,如果最高位是十六进制的a~f或A~F,前面要加零

3) 两个内存单元之间不能直接传送数据

4) 不能使用mov指令修改CSIP的值

5) 关于段寄存器

① 两个段寄存器之间不能直接传送;

② 不能把常数送到段寄存器。

错误举例:

1) mov ax,cl

2) ,mov al 300

3) mov 4000H,ax

4) mov ax A400H

5) mov [1],[2]

6) mov ds,cs

7) mov ds,1000H

2.      add形式

注意:

1) 操作数是内存单元时,指令中只给出「偏移地址」

2) 默认,「段地址」在ds中

3) add指令的操作数不能同时是内存单元

4) add指令的操作数不能是段寄存器

错误举例

1) add [1],[2]

2) add ds,[2]

3.      sub形式

注意:

1) 操作数是内存单元时,指令中只给出「偏移地址」

2) 默认,「段地址」在ds中

3) 两个内存单元不能直接使用sub指令相减

4) sub指令的操作数不能是段寄存器

错误举例:

1)sub [1],[2]

mov,add,sub举例

例1:写指令,计算从123B0H单元开始的前3个字节数据的累加和

mov ax, 123BH

mov ds, ax

mov al, 0

add al, [0]

add al, [1]

add al, [2]

例2:写指令,计算从123B0H单元开始的前3个字数据的累加和

mov ax, 123BH

mov ds, ax

mov ax, 0

add ax, [0]

add ax, [2]

add ax, [4]

例3:写指令,交换从123B0H单元开始的两个字节数据

mov ax, 123BH

mov ds, ax

mov al, [0]

mov bl, [1]

mov [1], al

mov [0], bl

1.      栈是一个逻辑上的概念,可以将一段内存空间当作「栈」来使用

2.      栈的特性:后进先出

3.      8086中栈以字为存取单位

4.      栈顶: 最后入栈的字数据所对应的地址单元

5.      栈底: 固定的一端,栈区最高地址单元的前一个单元

6.      入栈: 把数据存入栈

    第1步: 栈顶上移两个单元,即: 栈顶-2 → 栈顶

    第2步: 存入数据

7.      出栈: 从栈取出数据

    第1步: 取出字数据 → AX

    第2步: 栈顶下移两个单元,即: 栈顶+2 → 栈顶

8.      从栈中取出一个字数据给BX

    第1步: 取出数据→ BX

    第2步: 栈顶下移两个单元,即: 栈顶+2→栈顶

9.      栈为空时,栈顶指向栈底+2

与「栈」相关的寄存器SS和SP

1.      SS: 栈段段寄存器,用于存放栈段「段地址」

2.      SP: 栈指针寄存器,用于存放栈顶偏移地址

3.      SS:SP对应的物理地址栈顶的物理地址

    (SS) × 16 + (SP)  → 栈顶的物理地址

例子:设将20000H~2FFFFH这段内存当作栈来使用,栈的当前状态如图所示。

分析连续两次出栈操作SS和SP的内容的变化

初始:

(SS) = 2000H

(SP) = FFFCH

第1次出栈:

(SS) = 2000H

(SP) = FFFEH

第2次出栈:

(SS) = 2000H

(SP) = 0000H

「栈」操作指令: push和pop

 

注意:

1) 在 push 内存单元 和 pop内存单元 中,指令中只需给出「偏移地址」,默认段地址在DS中

2) 对8086CPU而言,push和pop的操作:

    入栈和出栈均以字为单元

    操作对象不能是常数

    pop 段寄存器中,段寄存器不能是CS和SS

3) 利用栈「后入先出」特性,使用push和pop指令可以完成一些特殊处理

4) 以下两种情形会发生「栈顶超界」问题

    1.当栈满的时候,再使用push指令入栈

    2.当栈空的时候,再使用pop指令出栈

    8086CPU不会自动考虑栈顶超界,需要程序员在编程设计时自己考虑。栈区长度不同,栈顶超界的具体情形也不同。

举例:

1.设将10000H~1FFFFH这段内存当作栈来使用

栈的初始状态如图所示。(SS) = 1000H  (SP) = 000EH

pop  ax        ; (ax) = 1234H

SP  ← (SP)  + 2

(SP) = 0010H

pop  ax        ; (ax) = ××H

SP  ← (SP)  + 2

(SP) = 0012H

2. 设将10000H~1000FH这段内存当作栈来使用

栈的初始状态如图所示。(SS) = 1000H  (SP) = FFFEH

pop  ax        ; (ax) = 1234H

SP  ← (SP)  + 2

(SP) = 0000H

pop  ax        ; (ax) = ××H

SP  ← (SP)  + 2

(SP) = 0002H

利用栈“保护现场”

设将10000H~1000FH这段内存当作栈来使用

栈的初始状态为空。(bx)=0010H, (cx)=2010H

mov   ax, 1000H

mov   ss, ax

mov   sp, 0010H

push bx

push cx

…       ;修改bx,cx

pop cx

pop bx

代码段执行完后,bx和cx内容未变

利用栈实现数据交换

设将10000H~1000FH这段内存当作栈来使用

栈的初始状态为空。(bx)=0010H, (cx)=2010H

mov   ax, 1000H

mov   ss, ax

mov   sp, 0010H

push bx

push cx

…       ;修改bx,cx

pop bx

pop cx

代码段执行完后,bx和cx内容交换

关于「段」的小结

(1)「段」是一个逻辑上的概念。

编程时,可根据需要指定一段内存区用作数据段、代码段或是栈段。

(2) 用作数据段时,要把段地址→DS

用作栈段时,要把段地址→SS,栈顶偏移地址 → SP

用作代码段时,段地址→CS,要取的指令偏移地址→IP。但CS和IP的值不能使用mov改变。

(3) 一段内存可以同时用作代码段、数据段、栈段。

由编程时灵活确定。

(4) 在8086CPU中,每个段的最大长度不能超过64KB。

(因为寄存器是16位的,能表示的地址范围只能是0000H~FFFFH,即0~216-1)

原文地址:https://www.cnblogs.com/gares/p/9922508.html

时间: 2024-08-02 02:04:54

汇编语言第三章小结的相关文章

第三章小结--栈与队列

第三章小结 第三章我们主要学习了栈和队列.经过第一次的写博客,与课后的学习与借鉴.我看到很多其他的同学在整理知识的时候采用了画大纲图,架构图的方法.不得不说,那样子确实比纯粹的文字更加简单明了.于是我决定也学习和效仿一下. 以下便是图解: 通过大图来看,很明显,和前面学习的顺序表,链表栈和队列的操作有同工异曲之妙.实际上围绕着栈和队列的也是分为两大分支,顺序表和链表.操作也是从初始化,插入,删除,查找几个操作入手. 当然,也有不同的地方,栈是典型的先进而后出,队列则是先进先出,其插入和删除的操作

汇编语言第三章知识梳理及思考

第三章 内存访问的角度学习寄存器 3.1内存中字的存储 0号单元是低地址单元,1号单元是高地址单元. 问题: (1)0地址单元(字节单元)中存放的字节型数据是多少?20H (2)0地址字单元中存放的字型数据是多少?4E20 (3)2地址字单元中存放的字节型数据是多少?12H (4)2地址单元中存放的字型数据是多少?0012H (5)1地址字单元中存放的字型数据是多少?124EH 结论:任何两个连续的内存单元,N号单元和N+1号单元,可以将它们看成一个地址为N的字单元中的高位字节单元N+1和低位字

DS第三章小结

一.你对本章内容的小结 本章主要讲了两种特殊的线性表,栈和队列.栈是仅在表尾进行插入或删除操作且后进先出(LIFO)的线性表,而队列则是在表的一端插入,另一端删除元素且先进先出(FIFO)的线性表.同时,课本的案例引入告诉我们,栈可以解决数值的转换,括号匹配的检验问题:而队列因其结构的吻合可以用了舞伴问题. 下面是本章的思维导图.对我来说,第三章比第二章更抽象,晦涩,难懂,仍然需要通过练习来对机械地吸收的知识加以运用. 二.完成作业实践时的心得体会 首先还是要多看课本,把基本的入栈,出栈,入队,

JAVA-初步认识-第三章-小结

一. 概论 第三章讲述的是JAVA语言基础,分为八个部分:关键字,标识符,注释,常量和变量,运算符,语句,函数和数组. →运算符(对于某种操作,浓缩为符号,上层的程序员采用这种符号.底层根据符号的不同,对数据做出不同的操作.) →要了解运算符的本质.→运算符的诞生,还是源于计算机程序语言的设计特点决定的. →计算机语言是对现实世界的,解析,重构.(用特定的计算机语言结构,但是最终的结果是一样的,过程也是一样的,和现实中的计算相比) 注意:用另一种方式,来重现现实世界的过程和结果. 用运算符对一些

汇编语言第三章总结

第三章中,我们从访问内存的角度了解学习几个寄存器 下面将知识点总结如下: 一.16位寄存器存储一个字,就要用高8位存放高位字节,低8位存放低位字节 0为低地址单元,1为高地址单元,表示数据4E20H(20000),起始地址是0,即是0地址字单元 存储字用两个单元,逆序存放,而存储字节只用一个单元 二.mov al,[0]  表示将内存单元内容存入寄存器,[]中的0表示偏移地址,DS寄存器,存放访问数据的段地址 用mov指令只能通过如 mov bx,1000 mov ds,bx 为DS寄存器赋值,

第三章小结

第三章学习了栈和队列. 有一个要搞清楚的点是 栈和队列的每一次操作都只对一个元素起作用.之前在学习计概这门课的时候,就已经接触了栈和队列的知识,知道LIFO和FIFO结构.但是没有学太深. 现在知道了栈和队列的作用以及一些基本的算法和主要操作. 总结: (1)顺序栈与链栈 主要操作:1.InitStack(SqStacke &S)(初始化)2.Push(SqStack &S,SElemType e)(入栈)3.Pop(SqStack &S,SElemType &e)(出栈)

汇编语言程序设计第二章小结

一.通用寄存器:AX.BX.CX和DX.(均为16位,可存放2个字节).都可以分为两个独立的8位寄存器.(eg:AH和AL,其中AL为低8位,AH为高8位.) 二.字在寄存器中的存储 1字节(byte)=8bit,1个字=2字节=高位字节+地位字节,分别对应存在高位寄存器和低位寄存器中. 三.汇编指令 注意:在写一条汇编指令或一个寄存器名称时不用区分大小写. 引入:mov和add 溢出问题:AH和AL是两个不相关到的寄存器,当操作AL中有进位时,AL不会向AH进位. (eg: mov ax,00

汇编语言第三章

一.知识点(博主自认为关键的几点) 1.把值存入段寄存器ds:需通过先给数据寄存器值(ax, bx, cx, dx),再送入ds中 如: mov ax,2000 mov ds,ax 2.字数据的存取原则: 字数据的低位字节存放在低地址内存单元:高位则放于高位地址:(小端法) 如:124EH在内存中的存放位置如下: (且地址为[1]) 3.关于mov指令值得注意的一点,当作为第二个操作数的常数最高位为a-f时,前面要加0 4.SS:SP,与ds相同,ss也不能直接送值 二.小测试 栈的使用主要需要

汇编语言:第三章 寄存器(内存访问)

3.1内存中字的存储 CPU中寄存器是16位的,可以用高低字节存储一个字,但是每个内存单元是8位的,只能存储一个字节, 所以内存中用相邻2个内存单元存储一个字的高低字节 如:20000数值(4E20H)在地址0的内存单元数值为20H,在地址1的内存单元数值为4EH 两个内存单元存储一个字型数据叫做一个字单元, 字单元的起始地址为N就叫N地址字单元,表示一个字的低字节在地址N的内存单元,高字节在地址N+1的内存单元 任意连续的2个内存单元都可以组成一个字单元 3.2 DS和 [address] C